zoukankan      html  css  js  c++  java
  • 设计模式(24)-----责任链模式

    责任链模式(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,成功!

    总结

      优点

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

      缺点

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

  • 相关阅读:
    Gmail、还有人需要吗?
    Google 打不开
    不能忽视的Doctype
    ASP.NET2.0中用ICallbackEventHandler实现客户端与服务器端异步交互
    DataGrid常用小技巧
    ASP.NET程序安全性(三) 表单提交、过滤用户输入
    Objection!!!
    编写3dmax插件需要注意的几个问题
    又一个IGame的bug
    VC2010中的C++0x特性 Part 1:Lambdas,auto, static_assert
  • 原文地址:https://www.cnblogs.com/a294098789/p/5627861.html
Copyright © 2011-2022 走看看