责任链模式(学习笔记)

责任链模式

    这不就是一个踢皮球模式么?!

适用场景:

         链式处理结构。

         什么是链式处理结构?

         我记得看新闻,经常有群众想要解决一个问题,先去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.      链太长了,性能会受到影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值