java设计模式之责任链模式

来源:互联网 发布:网络广告公司价格表 编辑:程序博客网 时间:2024/06/08 03:30

1,基本定义

   责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,请求者和处理者之间解耦,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

2,基本角色

抽象处理者角色:定义处理方法,以配置是否具有下个节点(Handler)对象.具体处理者角色:定义处理方法的具体执行逻辑,判断是否可以处理该请求,如果可以就处理(返回结果结束);如果不行,就查看是否有下个节点,如果有,就传递给下个节点处理.

3,责任链模式模型图

这里写图片描述

4,使用场景

责任链模式使用的场景还是蛮多的,比如在工作中,小明发现了一个Bug,要修复这个Bug,需要改动的地方很多,影响面很大,稍有不慎,会影响到项目开发排期,小明不该随意改动,这时候他首先请示上级,这个Bug该怎么处理,上级一听,发现事态严重,小bug自己可以搞定,但影响面这么大,出了篓子自己担不起责任,于是上级接着请示他的上级,这样一层层传递,最终,拥有何时职权的领导发出指示,该bug该如何处理。使用代码标示如下:

// 抽象处理者角色public Abstract Class Handler{    protected Handler mNext;    protected static final int PROCESS = 0;    protected static final int FOWARD = 1;    protected static final int FINISH= 2;    public final int handleRequest(AbsRequest request) {        int result = handle(request);        if(result == 1) {            if(mNext != null) {                mNext.handle(request);            } else {                // discard this request            }        } else if(result == 2){            // finsish the request        }    }    protected abstract int handle(AbsRequest request);    protected Handler getHandler(){        return mNext;    }    protected void setHandler(Handler handler) {        this.mNext = handler;    }}// 具体处理者角色public class ConcreteHandler extends Handler {    /**     * 处理方法,调用此方法处理请求     */    @Override    public int handle(AbsRequest request) {        // 具体处理的代码        if(true) {            // 处理具体事务            ....            return FINISH;        } else {            // 处理具体事务            ....            return FOWARD;        }    }}// 请求的业务类public Abstract class AbstractRequest{    public String content;    public AbstractRequest(String content){        this.content = content;    }    public String getCont(){        return content;    }}public class helloReq extends AbstractRequest{    public String content;    public helloReq (String content){        this.content = content;    }}//Clietpublic class Client {    public static void main(String[] args) {        //组装责任链        Handler handler1 = new ConcreteHandler();        Handler handler2 = new ConcreteHandler();        handler1.setHandler(handler2);        AbstractRequest req = new helloReq("Tommy")        //提交请求        handler1.handleRequest(req);    }}