责任链模式(Chain of Responsibility)----行为笔记
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条链,并沿着这条责任链传递请求,直到有对象处理它为止
一、涉及对象
抽象处理者(Handler):定义一个处理请求的接口;(接口、抽象类)
具体处理者(ConcreteHandler):在接到请求后,可以选择将请求处理掉,或者将请求传给下家。持有对下家的引用。
Client:提交请求。
二、何时适用
有多个处理者对象处理一个请求,哪个对象处理该请求运行时刻自动确定。
在不明确指定接收者的情况下,向多个对象中的一个提交一个请求,
处理一个请求的处理者对象集合需要动态指定时
注意:一个请求可能到了链的末端都得不到处理,或者因为没有正确配置,而得不到处理。
三、故事说明
CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!
责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接
起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。
抽象处理者(Handler):
public abstract class Handler { Handler nextHandler; public abstract void handleRequest(Request request); public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } }
具体处理者A(ConcreteHandler):public class ConcreteHandlerA extends Handler { public void handleRequest(Request request) { if(request.getType() == 1){ System.out.println("HandlerA处理了:" + request.getType()); }else if(null != nextHandler){ nextHandler.handleRequest(request); }else{ System.out.println("无处理:" + request.getType()); } } }
具体处理者B(ConcreteHandler):public class ConcreteHandlerB extends Handler { public void handleRequest(Request request) { System.out.println("HandlerB处理了:" + request.getType()); } }
请求(可替代)public class Request { int type; public int getType() { return type; } public void setType(int type) { this.type = type; } }
public class Client { public static void main(String[] args) { Handler handlerA = new ConcreteHandlerA(); Handler handlerB = new ConcreteHandlerB(); handlerA.setNextHandler(handlerB); Request request = new Request(); request.setType(1); handlerA.handleRequest(request); System.out.println("----------分割不同请求-------------"); Request request2 = new Request(); request2.setType(2); handlerA.handleRequest(request2); } /* HandlerA处理了:1 ----------分割不同请求------------- HandlerB处理了:2 */ }