设计模式之职责链模式

来源:互联网 发布: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);}}

运行截图


有一点很值得注意,一个请求有可能一直到职责链末尾也没有对象进行处理,这需要在设计之初就预留下默认的处理者。

以上内容,整理自刘径舟,张玉华编著的《设计模式其实很简单》读书笔记,欢迎转载