java设计模式——责任链模式

1.责任链模式概述

    所谓的责任链就是你本身是否有能力去处理这件事,没办法处理的话就会传递给比你则为高或者更厉害的人处理。举个例子: 如加工鸡爪工厂,采购员去采购原生鸡爪,采购量小的话可以直接采购,采购量大的话就要交给采购经理审批,审批通过才可进行采购,以此类推。

2.责任链模式的实现

    首先我们以采购鸡爪为实例,对其进行UML图设计,如下所示:


我们通过UML图来进行创建代码并分析,我们定义了一个鸡爪的实体类count字段代表要采购的鸡爪总数,这里只是为了测试不做过多的声明代码如下:

接着是责任链的重点,我们抽象出了一个职位的抽象类,该类有职位名称,以及要传递给下一个的职位。一个抽象的方法requestRedirect表示当前职位是否能处理该采购单,不能的话就会传递给下一个高职位的人。我们来看一看我们抽象类以及对应实体类所编写的示例代码更方便理解。


我们处理了三种不同职责的职位,采购员只能采购500个以下,高出的会交予采购经理,采购经理只能处理5000一下的,再高的会交予CEO进行处理。

    客户端进行创建的时候,会创建出三种职位,以及对其进行链式引用。我们创建不同采购鸡爪的数量都交给采购员。采购员便会根据职责进行一层层的传递下去代码如下:


3.责任链总结(引用:http://cmsblogs.com/?p=5006)

1.主要优点

职责链模式的主要优点如下:

(1) 职责链模式使得一个对象无须知道是其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度。

(2) 请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接。

(3) 在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。

(4) 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。

2.主要缺点

职责链模式的主要缺点如下:

(1) 由于一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理。

(2) 对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。

(3) 如果建链不当,可能会造成循环调用,将导致系统陷入死循环。

3.适用场景

在以下情况下可以考虑使用职责链模式:

(1) 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。

(2) 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

(3) 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。

你可能感兴趣的:(java设计模式——责任链模式)