设计模式之职责链模式

来源:互联网 发布:淘宝网店申请 编辑:程序博客网 时间:2024/05/16 10:34

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。


Handler类,定义一个处理请求的接口。

public abstract class Handler {    protected Handler mSuccessor;    // 设置继任者    public void setSuccessor(Handler successor) {        mSuccessor = successor;    }    public abstract void handleRequest(int request);}

ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。

public class ConcreteHandler1 extends Handler {    @Override    public void handleRequest(int request) {        if (request >= 0 && request < 10) {            System.out.println(getClass().getSimpleName() + "处理请求");        } else if (mSuccessor != null) {            mSuccessor.handleRequest(request);        }    }}

public class ConcreteHandler2 extends Handler {    @Override    public void handleRequest(int request) {        if (request >= 10 && request < 20) {            System.out.println(getClass().getSimpleName() + "处理请求");        } else {            System.out.println("请求错误,无法处理");        }    }}

调用:

ConcreteHandler1 handler1 = new ConcreteHandler1();ConcreteHandler2 handler2 = new ConcreteHandler2();handler1.setSuccessor(handler2);handler1.handleRequest(2);handler1.handleRequest(12);handler1.handleRequest(22);

输出结果:

ConcreteHandler1处理请求ConcreteHandler2处理请求请求错误,无法处理

职责链的好处:

当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。

可以随时地增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

一个请求极有可能到了链的末端都得不到处理,或者因为没有正确的配置而得不到处理。需要事先考虑全面。

管家中骚扰拦截、私密空间、手机找回模块都需要处理短信,可以根据优先级处理短信,号码不在该模块的话把请求交给下一个对象处理。

0 0
原创粉丝点击