责任链模式(chain of responsibility)

定义

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

UML类图

角色

  抽象处理者(Handler)角色 :定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。
  具体处理者(ConcreteHandler)角色 :如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。

例子

  有人想请假,小组长只能审批小于等于1天的假期,项目经理可以审批小于等于3天的假期,CEO可以审批所有的假期。

  Handler

package com.csdhsm.designpattem.chainofresponsibility;

/**  
 * @Title:  Handler.java   
 * @Description: 审批请假抽象类
 * @author: Han   
 * @date:   2016年6月29日 下午6:05:46   
 */  
public abstract class Handler {
    
    protected Handler handler;

    public Handler getHandler() {
        return handler;
    }

    public void setHandler(Handler handler) {
        this.handler = handler;
    }
    
    //审批方法
    public abstract void approve(int day);
}

  GroupLeader(小组长)

package com.csdhsm.designpattem.chainofresponsibility;

/**  
 * @Title:  GroupLeader.java   
 * @Description: 小组长,能审批的是小于等于1天的请假申请 
 * @author: Han   
 * @date:   2016年6月29日 下午5:58:29   
 */  
public class GroupLeader extends Handler {

    @Override
    public void approve(int day) {
        if(day <= 1) {
            System.out.println("小组长审批");
        } else {
            System.out.println("超过了小组长权限,移交上级");
            this.getHandler().approve(day);
        }
    }
}

  ProjectManager(项目经理)

package com.csdhsm.designpattem.chainofresponsibility;

/**  
 * @Title:  ProjectManager.java   
 * @Description: 项目经理,能审批的是小于等于3天的请假
 * @author: Han   
 * @date:   2016年6月29日 下午6:01:49   
 */  
public class ProjectManager extends Handler {

    @Override
    public void approve(int day) {
        if(day <= 3) {
            System.out.println("项目经理审批");
        } else {
            System.out.println("超过了项目经理权限,移交上级");
            getHandler().approve(day);
        }
    }
}

  CEO

package com.csdhsm.designpattem.chainofresponsibility;

/**  
 * @Title:  CEO.java   
 * @Description: 最后移交到CEO审批
 * @author: Han   
 * @date:   2016年6月29日 下午6:03:59   
 */  
public class CEO extends Handler {

    @Override
    public void approve(int day) {
        System.out.println("CEO审批");
    }
}

  客户端

package com.csdhsm.designpattem.chainofresponsibility;

public class Solution {
    public static void main(String[] args) {
        Handler leader = new GroupLeader();
        Handler manager = new ProjectManager();
        Handler ceo = new CEO();
        
        //把Handler连成一条链
        leader.setHandler(manager);
        manager.setHandler(ceo);
        
        //处理请求
        leader.approve(6);
    }
}

  结果

  OK,成功!

总结

  优点

    调用者不需知道具体谁来处理请求,也不知道链的具体结构,降低了节点域节点的耦合度;可在运行时动态修改链中的对象职责,增强了给对象指派职责的灵活性。

  缺点

    没有明确的接收者,可能传到链的最后,也没得到正确的处理。

 posted on 2016-06-29 18:21  韩思明  阅读(172)  评论(0编辑  收藏  举报