责任链模式
这不就是一个踢皮球模式么?!
适用场景:
链式处理结构。
什么是链式处理结构?
我记得看新闻,经常有群众想要解决一个问题,先去A部门,A部门说,这事不归我管,去B部门吧。到了B处,也说不归他们管,让去找C去。。。这个群众就被这么像皮球一样踢,就怕来回踢,踢出个环来,就死循环了。这就是一个链式处理结构。比如,你要请假,一天,找班主任就行,请一周?!班主任说这个得找主任。如果你要请一个月,主任也不好使了,找校长吧!
班主任->主任->校长,这就是一个链式处理结构。
先说一个比较笨的方法,如果把这些逻辑放在一起,写一个处理类:
Publicvoid handle(){
If(班主任能处理)
班主任处理;
else(主任能处理)
主任处理;
else
校长处理;
}
显然,如果遇到变动,比如,中间加一个副校长,就得修改源代码,违反开闭原则,而且,这个类直接和事件处理类耦合在一起,不好不好。
下面看看责任链模式如何解决这个问题,uml图如下:
责任链模式uml图
解释,实现的方法就是定义一个抽象类,组合了一个自己的对象,并且有一个handle方法。它的子类在实现这个方法的时候,会去判断,如果自己可以处理,就处理,否则,委托给自己组合的那个对象,也就是把皮球“踢”给下一个。
责任链模式只是告诉你可以使用上述的方法处理,并不负责创建对象,对象要交给客户端去做。这里,我自己实现了一个创建对象的类,可以这么写:
class ChainFactory{
Handler last;
//创建链
public void createChain(Handlerfirst){
first.setSuccesser(newLastHandler());
last= first;
}
//追加一个处理对象
Public void addHandler(Handler handler){
handler.setSucesser(last.getSucesser());
last.setSucesser(handler);
}
//工厂里定义了一个空的Handler,作为链上特定的最后一个节点
Class LastHandler exenteds Handler{
Publicvoid handler(){}
}
}
这就是一个类似单链表的数据结构。当然,你也可以把所有的创建代码都写在客户段中。
责任链模式好处:
1. 解耦,无需知道这个事件到底交给谁处理。只需要交给链上头一个就可以。
2. 灵活,增加或删除链上的对象,都比较灵活。
注意:
1. 某个消息可能到最后也没有被处理;
2. 注意别出现死循环(被来回踢了。。);
3. 链太长了,性能会受到影响。