[设计模式]职责链模式
2017-09-24 18:46
274 查看
开始写设计模式系列,希望自己可以坚持下来.
第七篇:职责链模式
抽象的处理者:
具体的处理者:
使用:
输出:
这就是简易的职责链,结构特别的简单,但是问题来了,对于稳定运行的代码他的职责链应该是相对固定的,那么难道我们每次使用都要new出每一个处理者并建立职责链吗?我们可以建立一个管理类将这个过程封装起来
调用:
结果是一致的,。
我们需要将请求类也抽象出来。
抽象请求类:
具体的请求:
抽象的处理类:
具体的处理类:
职责链管理器:
调用:
结果:
我们将请求分离了出来丰富了请求的内容,使得能够在请求体内携带更多的信息。这些信息能够在请求的初始化以及处理类的处理中提供很大的帮助,并且我们将处理请求方法(handle)与请求分发分离(handlerRequest),使得逻辑更加的清晰。
职责链模式是比较简单的行为模式,他和状态模式比起来相似之处很多,但是又截然不同。
参考《Android源码设计模式解析与实战》中第九章–使编程更有灵活性——职责链模式
第七篇:职责链模式
什么是职责链模式
关于职责链模式GOF是这样定义的:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间额耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。简易实现
Talk is cheap,我们来看下最为简易的职责链实现。抽象的处理者:
package top.huyuxin.ChainofResponsibility; public abstract class Handler { public Handler nextHandler; public abstract void handleRequest(String condition); }
具体的处理者:
package top.huyuxin.ChainofResponsibility; public class FirstHandler extends Handler { @Override public void handleRequest(String condition) { if("first".equals(condition)){ System.out.println("firsthandler capture it!"); }else{ nextHandler.handleRequest(condition); } } }
package top.huyuxin.ChainofResponsibility; public class SecondHandler extends Handler { @Override public void handleRequest(String condition) { if("second".equals(condition)){ System.out.println("secondhandler capture it!"); }else{ nextHandler.handleRequest(condition); } } }
package top.huyuxin.ChainofResponsibility; public class ThirdHandler extends Handler { @Override public void handleRequest(String condition) { if("third".equals(condition)){ System.out.println("thirdhandler capture it!"); }else{ System.out.println("no one can capture it!"); } } }
使用:
package top.huyuxin.ChainofResponsibility; public class Main { public static void main(String[] args) { Handler firstHandler = new FirstHandler(); Handler secondHandler = new SecondHandler(); Handler thirdHandler = new ThirdHandler(); firstHandler.nextHandler=secondHandler; secondHandler.nextHandler=thirdHandler; firstHandler.handleRequest("first"); System.out.println("-----------"); firstHandler.handleRequest("second"); System.out.println("-----------"); firstHandler.handleRequest("third"); System.out.println("-----------"); firstHandler.handleRequest("four"); } }
输出:
firsthandler capture it! ----------- secondhandler capture it! ----------- thirdhandler capture it! ----------- no one can capture it!
这就是简易的职责链,结构特别的简单,但是问题来了,对于稳定运行的代码他的职责链应该是相对固定的,那么难道我们每次使用都要new出每一个处理者并建立职责链吗?我们可以建立一个管理类将这个过程封装起来
package top.huyuxin.ChainofResponsibility; public class HandlerManger { private HandlerManger() { super(); } public static class HandlerManagerInstance{ private static HandlerManger instance=new HandlerManger(); public static HandlerManger getInstance() { return instance; } } private static Handler firstHandler; private static Handler secondHandler; private static Handler thirdHandler; static{ firstHandler = new FirstHandler(); secondHandler = new SecondHandler(); thirdHandler = new ThirdHandler(); } public void handleRequest(String condition){ firstHandler.nextHandler=secondHandler; secondHandler.nextHandler=thirdHandler; firstHandler.handleRequest(condition); } }
调用:
package top.huyuxin.ChainofResponsibility; public class Main { public static void main(String[] args) { HandlerManger handlerManger = HandlerManger.HandlerManagerInstance.getInstance(); handlerManger.handleRequest("first"); System.out.println("-----------"); handlerManger.handleRequest("second"); System.out.println("-----------"); handlerManger.handleRequest("third"); System.out.println("-----------"); handlerManger.handleRequest("four"); }
结果是一致的,。
实战
在实际的项目中请求条件的匹配简单的字符串判断是远远不够的,我们需要将请求类也抽象出来。
抽象请求类:
package top.huyuxin.ChainofResponsibility.plus; public abstract class AbstrastRequest { //定义统一的请求级别 public static final int FIRST_REQUEST=1; public static final int SECOND_REQUEST=2; public static final int THIRD_REQUEST=3; //可有可无,用于开发者创建请求时传入个性化且必要的初始化参数 private Object object; public AbstrastRequest(Object object){ this.object=object; } //获取对应的参数 public Object getContent(){ return object; } public abstract int getRequestLevel(); }
具体的请求:
package top.huyuxin.ChainofResponsibility.plus; import org.omg.CORBA.Request; public class FirstRequest extends AbstrastRequest { public FirstRequest(String name) { super(name); } @Override public int getRequestLevel() { return FIRST_REQUEST; } @Override public String toString() { return "FirstRequest [name=" + getContent() + ", getRequestLevel()=" + getRequestLevel() + "]"; } }
package top.huyuxin.ChainofResponsibility.plus; public class SecondRequest extends AbstrastRequest { public SecondRequest(int initflag) { super(initflag); } @Override public int getRequestLevel() { return SECOND_REQUEST; } @Override public String toString() { return "SecondRequest [initflag=" + getContent() + ", getRequestLevel()=" + getRequestLevel() + "]"; } }
package top.huyuxin.ChainofResponsibility.plus; public class ThirdRequest extends AbstrastRequest { public ThirdRequest(Boolean flag) { super(flag); } @Override public int getRequestLevel() { return THIRD_REQUEST; } @Override public String toString() { return "ThirdRequest [flag=" + false + ", getRequestLevel()=" + getRequestLevel() + "]"; } }
抽象的处理类:
package top.huyuxin.ChainofResponsibility.plus; public abstract class AbstractHandler { protected AbstractHandler nextHandler; public final void handlerRequest(AbstrastRequest request){ if(getHandleLevel()==request.getRequestLevel()){ handle(request); }else { if(nextHandler!=null){ nextHandler.handle(request); }else{ System.out.println("no handler can deal with the request!"); } } } protected abstract int getHandleLevel(); protected abstract void handle(AbstrastRequest request); }
具体的处理类:
package top.huyuxin.ChainofResponsibility.plus; public class FirstHandler extends AbstractHandler { @Override protected int getHandleLevel() { return AbstrastRequest.FIRST_REQUEST; } @Override protected void handle(AbstrastRequest request) { System.out.println("i can deal with the request:"+request.toString()); } }
package top.huyuxin.ChainofResponsibility.plus; public class SecondHandler extends AbstractHandler { @Override protected int getHandleLevel() { return AbstrastRequest.SECOND_REQUEST; } @Override protected void handle(AbstrastRequest request) { System.out.println("i can deal with the request:"+request.toString()); } }
package top.huyuxin.ChainofResponsibility.plus; public class ThirdHandler extends AbstractHandler { @Override protected int getHandleLevel() { return AbstrastRequest.THIRD_REQUEST; } @Override protected void handle(AbstrastRequest request) { System.out.println("i can deal with the request:"+request.toString()); } }
职责链管理器:
package top.huyuxin.ChainofResponsibility.plus; public class HandlerManger { private HandlerManger() { super(); } public static class HandlerManagerInstance{ private static HandlerManger instance=new HandlerManger(); public static HandlerManger getInstance() { return instance; } } private static AbstractHandler firstHandler; private static AbstractHandler secondHandler; private static AbstractHandler thirdHandler; static{ firstHandler = new FirstHandler(); secondHandler = new SecondHandler(); thirdHandler = new ThirdHandler(); } public void handleRequest(AbstrastRequest request){ firstHandler.nextHandler=secondHandler; secondHandler.nextHandler=thirdHandler; firstHandler.handlerRequest(request); } }
调用:
package top.huyuxin.ChainofResponsibility.plus; public class Main { public static void main(String[] args) { HandlerManger handlerManger=HandlerManger.HandlerManagerInstance.getInstance(); FirstRequest firstRequest=new FirstRequest("FirstRequest"); SecondRequest secondRequest=new SecondRequest(2); ThirdRequest thirdRequest=new ThirdRequest(true); handlerManger.handleRequest(firstRequest); handlerManger.handleRequest(secondRequest); handlerManger.handleRequest(thirdRequest); } }
结果:
i can deal with the request:FirstRequest [name=FirstRequest, getRequestLevel()=1] i can deal with the request:SecondRequest [initflag=2, getRequestLevel()=2] i can deal with the request:ThirdRequest [flag=false, getRequestLevel()=3]
我们将请求分离了出来丰富了请求的内容,使得能够在请求体内携带更多的信息。这些信息能够在请求的初始化以及处理类的处理中提供很大的帮助,并且我们将处理请求方法(handle)与请求分发分离(handlerRequest),使得逻辑更加的清晰。
职责链模式是比较简单的行为模式,他和状态模式比起来相似之处很多,但是又截然不同。
参考《Android源码设计模式解析与实战》中第九章–使编程更有灵活性——职责链模式
相关文章推荐
- Java设计模式(二十二):职责链模式
- 设计模式之职责链模式
- 设计模式六大原则(1):单一职责原则
- 设计模式笔记(20)---职责链模式(行为型)
- 设计模式读书笔记之职责链模式(chain of responsibility)
- 设计模式之 职责链模式
- 【设计模式】三、单一职责原则,开发-封闭原则,依赖倒转原则
- 设计模式六大原则<一>单一职责原则
- 设计模式之Chain of Responsibility(职责链)
- 23种经典设计模式的java实现_5_职责链模式
- java设计模式---职责链模式
- 设计模式6大原则:单一职责原则
- 设计模式之Chain of Responsibility(职责链)
- 设计模式六大原则之--单一职责原则(SRP)
- 职责链模式-设计模式系列
- 设计模式--单一职责原则(SRP)
- java设计模式之职责链模式
- 被说了很多遍的设计模式---职责链模式
- 设计模式 之 职责链
- C++设计模式---职责链模式