浅说责任链和装饰者

定义,类图都不再赘述。这里只记录一点我自己的理解。

关于责任链

责任链可以有内置和外置两种。内置责任链是在链中的各个环自己确认下一个处理器;外置责任链是在单独维护一条链,链条中的各个环节实际是不知道自己的下家的。内置的链实际是一个栈。外置的才是真正的链。

对外置的责任链,整个链条不一定要处理完,并且可以方便的根据返回值很方便的中断。对于内置的责任链,需要逐层的退栈和判断,会比较麻烦,因此一般会尽量让整个链条都执行完。

一般来说,责任链是多个处理器从同一维度来共同完成一项工作。比如某本模式书上举的中国古代女子从父、从夫、从子的责任链例子,父、夫、子都是同一个处理维度。

关于装饰者

装饰者更像是内置链条的责任链。但就我所使用的情况看,责任链通常是有预定义的链条的;而装饰者更多的是根据实际情况自定义装饰、处理顺序的。

通常,装饰者的每一层装饰,都是从不同维度来完成一项工作。比如著名的java中的inputstream,什么文件输入流,有缓存的输入流,字节型输入流等,就是从不同的维度来处理输入流的。

2012-04-16 更新

对外置的责任链来说,链的状态对链的每一环都是透明的;而内置的责任链,以及装饰者,链的每一环上至少要有指向下一环的引用,这就隐含了链的一种状态。

就扩展性来说,外置链应该是更强的。它可以根据用户的选择,在运行时装配必要的链,并且链的每一环均可以作为单例来复用。而装饰者虽然也可以在运行时装配,但由于每一环都存有链的一个状态,因此单例模式不太适用。内置链类似。如果所需的链式的服务是比较固定化的,可以使用后两者;如果变化较多,建议用第一种。