码迷,mamicode.com
首页 > 其他好文 > 详细

指责链模式

时间:2015-05-19 20:44:11      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

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

  类图:

技术分享

        PS.Successor是继承者的意思,如果当前的Handler不能处理请求时,就将请求传给Successor。

  适用性:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

  优缺点:

  • 降低耦合性。客户无需知道请求具体是被哪个对象处理了,只需要知道把请求发给谁即可。
  • 增强了给对象指派职责的灵活性。我们可以在处理请求的类中修改successor即可修改职责链。
  • 不保证被接受。我们只是把请求放到职责链中,具体该链如何处理该请求是由链自己决定的。

  

  模板代码(参考《大话设计模式》):

public class 职责链模式 {
    public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();
        h1.SetSuccessor(h2);
        h2.SetSuccessor(h3);
        
        int[] request = {5, 15, 25, 35};
        
        for(int i : request) 
            h1.HandleRequest(i);
    }
}
class Handler {
    protected Handler successor;
        
    public void SetSuccessor(Handler successor) {
        this.successor = successor;
    }
    
    public void HandleRequest(int request) {}
}

class ConcreteHandler1 extends Handler {
    public void HandleRequest(int request) {
        if(request >= 0 && request < 10) {
            System.out.println("ConcreteHandler1 handle request " + request);
        } 
        else {
            if (successor != null) {
                successor.HandleRequest(request);
            } else {
                System.out.println("Request " + request + " is unhandled");
            }
        }
    }
}

class ConcreteHandler2 extends Handler {
    public void HandleRequest(int request) {
        if(request >= 10 && request < 20) {
            System.out.println("ConcreteHandler2 handle request " + request);
        } 
        else {
            if (successor != null) {
                successor.HandleRequest(request);
            } else {
                System.out.println("Request " + request + " is unhandled");
            }
        }
    }
}

class ConcreteHandler3 extends Handler {
    public void HandleRequest(int request) {
        if(request >= 20 && request < 30) {
            System.out.println("ConcreteHandler3 handle request " + request);
        } 
        else {
            if (successor != null) {
                successor.HandleRequest(request);
            } else {
                System.out.println("Request " + request + " is unhandled");
            }
        }
    }
}

  例子:向老师请假时,如果请假日太多,需要上交给年级主任,如果请更多,需要上交给学校。

  

  小结:职责链可以将原本需要长长的if-else if或switch-case语句分解,原本会根据请求的类型来进行相关处理,现在将相关处理都封装成类,我们只需要将请求发给最低级的处理类(嘛,也不一定要从最低级的开始),该处理类会判断该请求自己能否处理,如果不能则交给下一级。其实有点像异常的处理。

指责链模式

标签:

原文地址:http://www.cnblogs.com/programmer-kaima/p/4432961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!