职责链模式--解决不了的事往上传

来源:互联网 发布:js 对象添加属性和值 编辑:程序博客网 时间:2024/05/21 21:34

职责链模式(Chain of Responsibility):使得多个对象都有机会处理请求,从而避免请求的发送者和

接受者之间的耦合关系。将这个对象连城一条链,并沿着这条连传递该请求,

直到有一个对象处理它为止。

一个现实中的例子就是,你要求加薪,

然后你跟经理说,经理又去找了人力资源总监谈了谈,人力资源总监又说去跟总经理聊一聊。

这样可以看出,如果当前对象能够处理,就自己处理,处理不了的话,就会把需求往上提。

还是先看类图:



抽象的处理类Handler,他里面有一个指向同类的下一层极,

接下来是三个具体的实现类,可以理解为经理,总监,总经理。

Client是客户端测试类。

职责链模式的关键是当客户提交一个请求时,请求时沿着链传递直至有

一个ConcreteHandler对象负责处理它。

每个职责对象都仅需保持一个指向其后继者的引用,而不需要保存他所有候选接受者的引用。

注意一点:一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理!


要区分职责链模式与状态模式的区别:状态模式--将条件拆分出去  

二者都是将条件查分出去,但是状态模式是一开始就固定好的状态链,而职责链模式

则可以在客户端自己设置链的指向。


下面看具体实现代码:

Handler类:

package com.blog.anla.ChainOfResponsibility;/** * 定义一个处理请示的抽象类, * 实现这个接口的即都可以处理请求。 * @author U-ANLA * */public abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}/** * 具体处理方法,有相应子类去实现 * @param request */public abstract void handleRequest(int request);}


ConcreteHandler1类:

package com.blog.anla.ChainOfResponsibility;public class ConcreteHandler1 extends Handler{@Overridepublic void handleRequest(int request) {if(request >= 0 && request < 10){System.out.println("由handler1处理");}else if(successor != null){//给上一级去处理successor.handleRequest(request);}}}


ConcreteHandler2类:

package com.blog.anla.ChainOfResponsibility;public class ConcreteHandler2 extends Handler{@Overridepublic void handleRequest(int request) {if(request >= 10 && request < 20){System.out.println("由handler2处理");}else if(successor != null){//给上一级去处理successor.handleRequest(request);}}}


ConcreteHandler3类:

package com.blog.anla.ChainOfResponsibility;public class ConcreteHandler3 extends Handler{@Overridepublic void handleRequest(int request) {if(request >= 20 && request < 30){System.out.println("由handler3处理");}else if(successor != null){//给上一级去处理successor.handleRequest(request);}else{System.out.println("这个真处理不了");}}}


Client类:

package com.blog.anla.ChainOfResponsibility;/** * 客户端代码,用于实践职责链模式 * @author U-ANLA * */public class Client {public static void main(String[] args) {ConcreteHandler1 h1 = new ConcreteHandler1();ConcreteHandler2 h2 = new ConcreteHandler2();ConcreteHandler3 h3 = new ConcreteHandler3(); //设置上司,即设置下一级h1.setSuccessor(h2);h2.setSuccessor(h3);int[] requests = {2,5,14,30,13,22};for(int i = 0;i < requests.length;i++){//先给h1处理,会一步步下去。h1.handleRequest(requests[i]);}}}

有帮助的话顶一下啊!


赠人玫瑰手留余香(oo)

原创粉丝点击