设计模式之职责链模式
来源:互联网 发布:java 一个对象的大小 编辑:程序博客网 时间:2024/06/14 09:32
GOF对职责链模式的定义是:使各个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合程度,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他们为之。
先看基本代码
//处理请示的接口public abstract class Handler {protected Handler successor;//设定被授权者public void SetSuccessor(Handler successor) {this.successor = successor;}//抽象的处理请求方法public abstract void HandleRequest(int request);}
public class HandlerA extends Handler {@Overridepublic void HandleRequest(int request) {if(request == 1) {System.out.println(this.getClass().getCanonicalName() + "处理了请求" + request);}else {if(this.successor != null) {System.out.println(this.getClass().getCanonicalName()+"自身搞不定,转入下一个请求者!");this.successor.HandleRequest(request);}}}}public class HandlerB extends Handler {@Overridepublic void HandleRequest(int request) {if(request == 2) {System.out.println(this.getClass().getCanonicalName() + "处理了请求" + request);}else {if(this.successor != null) {System.out.println(this.getClass().getCanonicalName()+"自身搞不定,转入下一个请求者!");this.successor.HandleRequest(request);}}}}public class HandlerC extends Handler {@Overridepublic void HandleRequest(int request) {System.out.println(this.getClass().getCanonicalName() + "处理了请求" + request);}}客户端代码如下
public class Client {public static void main(String[] args) {Handler ha = new HandlerA();Handler hb = new HandlerB();Handler hc = new HandlerC();ha.SetSuccessor(hb);hb.SetSuccessor(hc);for (int i = 1; i < 5; i++) {ha.HandleRequest(i);}}}
运行截图
可以看到,每个请求的处理者首先都是检查自己的处理权限是否足够,这个权限可以由开发人员设置校验方式,然后对自己有权限处理的事务进行裁断,没有权限的就转发给权限更高一级的处理者。
看个小Demo,以钦差大臣奉皇上之命去查贪官为例,操作一波职责链
//抽象的裁决者public abstract class Handler {protected Handler handler;//设定裁决者public void SetHandler(Handler handler) {this.handler = handler;}//抽象的处理请求方法public abstract void HandlerRequest(int count);}
public class Prefects extends Handler {@Overridepublic void HandlerRequest(int count) {if(count < 5) {System.out.println("钦差:贪官数--" + count + "可以直接判决,");}else {if(this.handler != null){System.out.println("贪官数--" + count + ",不能全砍了呀,上奏陛下圣裁吧");this.handler.HandlerRequest(count);}}}}
public class Emperor extends Handler {@Overridepublic void HandlerRequest(int count) {// TODO Auto-generated method stubSystem.out.println("圣裁:" + count + "太多了,砍4个,剩下的带来见我");}}客户端实现
public class Client {public static void main(String[] args) {Handler prefects = new Prefects();Handler emperor = new Emperor();prefects.SetHandler(emperor);for(int i=3;i<8;i++)prefects.HandlerRequest(i);}}
运行截图
有一点很值得注意,一个请求有可能一直到职责链末尾也没有对象进行处理,这需要在设计之初就预留下默认的处理者。
以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载
阅读全文
0 0
- 设计模式 之 职责链
- 设计模式之职责链
- 设计模式之职责链
- 设计模式之职责链模式
- 设计模式之职责链模式
- C# 设计模式之 职责链模式
- 设计模式之职责链模式
- 大话设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- 大话设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之-----职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- 设计模式之职责链模式
- C++设计模式之职责链模式
- python安装pip和requests库
- 求点到直线的距离
- TCP数据传输协议(二)
- apt yum
- java 入门
- 设计模式之职责链模式
- SQLite数据库操作
- 从mysql数据表中随机取出一条记录
- TensorFlow读取数据
- 第二个任务
- 读书笔记 | 为什么从世界500强CEO、政界要员,到著名演员都用这个方法来提高效率?
- JS —— 笔记,$("document").ready() 中ajax 与 $.ajax() 及同步异步优先级问题
- Java并发编程:volatile关键字解析
- java基础数据结构分析