责任链模式:
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
组成结构:
- 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
- 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
类图:
代码实现:
public abstract class Handler { public Handler successor; public abstract void handleRequest(); public void setSuccessor(Handler successor) { this.successor = successor; } }
public class ConcreteHandlerA extends Handler { @Override public void handleRequest() { System.out.println("A处理请求"); if(successor != null){ successor.handleRequest(); } } }
public class ConcreteHandlerB extends Handler { @Override public void handleRequest() { System.out.println("B处理请求"); if(successor != null){ successor.handleRequest(); } } }
public class Client { public static void main(String[] args) { Handler managerA = new ConcreteHandlerA(); Handler managerB = new ConcreteHandlerB(); managerA.setSuccessor(managerB); managerA.handleRequest(); } }
责任链模式和状态模式:
代码结构较为类似,责任链模式,客户端知道流程,由客户端组织流程。状态模式是程序设计时候就把流程设定好了。