设计模式:责任链模式

责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止。
概述

定义如下:一个请求有多个对象来处理,这些对象形成一条链,根据条件确定具体由谁来处理,如果当前对象不能处理则传递给该链中的下一个对象,直到有对象处理它为止。 责任链模式通过将请求和处理分离开来,以进行解耦。职责链模式结构的核心在于引入了一个抽象处理者。

UML结构图

案例
1.定义 AbstractHandler(抽象处理者),使子类形成一条链
public abstract class AbstractHandler {
private AbstractHandler handler ;

public AbstractHandler getHandler() {
return handler;
}

public void setHandler(AbstractHandler handler) {
this.handler = handler;
}
public abstract void handleRequest(String condition);
}
2.创建若干个 ConcreteHandler(具体处理者)继承 AbstractHandler,在当前 处理者对象无法处理时,将执行权传给下一个 处理者对象
public class ConcreteHandlerA extends AbstractHandler {
@Override
public void handleRequest(String condition) {
if (condition.equalsIgnoreCase("A")) {
System.out.println("ConcreteHandlerA处理");
} else {
System.out.println("ConcreteHandlerA不处理,由其他的Handler处理");
super.getHandler().handleRequest(condition);
}
}
}
public class ConcreteHandlerB extends AbstractHandler {
@Override
public void handleRequest(String condition) {
if (condition.equalsIgnoreCase("B")) {
System.out.println("ConcreteHandlerB处理");
} else {
System.out.println("ConcreteHandlerB不处理,由其他的Handler处理");
super.getHandler().handleRequest(condition);
}
}
}
public class ConcreteHandlerC extends AbstractHandler {

@Override
public void handleRequest(String condition) {
System.out.println("ConcreteHandlerC处理");

}
}
3.创建 ChainClient(测试类)
public static void main(String args[]) {
ConcreteHandlerA concreteHandlerA = new ConcreteHandlerA();
ConcreteHandlerB concreteHandlerB = new ConcreteHandlerB();
ConcreteHandlerC concreteHandlerC = new ConcreteHandlerC();
concreteHandlerA.setHandler(concreteHandlerB);
concreteHandlerB.setHandler(concreteHandlerC);
concreteHandlerA.handleRequest("d");
}
运行效果
ConcreteHandlerA不处理,由其他的Handler处理
ConcreteHandlerB不处理,由其他的Handler处理
ConcreteHandlerC处理
总结
职责链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递,请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。在软件开发中,如果遇到有多个对象可以处理同一请求时可以应用职责链模式,例如在Web应用开发中创建一个过滤器(Filter)链来对请求数据进行过滤,在工作流系统中实现公文的分级审批等等,使用职责链模式可以较好地解决此类问题。
优点
降低耦合度,分离了请求与处理,无须知道是哪个对象处理其请求
简化对象的相互连接,仅保持一个指向后者的引用,而不需保持所有候选接受者的引用
扩展容易,新增 具体请求处理者,只需要在客户端重新建链即可,无需破坏原代码
缺点
如果请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理
较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。
如果建链不当,可能会造成循环调用,将导致系统陷入死循环。

posted @ 2018-06-24 22:15  霸王猿  阅读(346)  评论(0编辑  收藏  举报