• 设计模式(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,成功!

    总结

      优点

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

      缺点

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

  • 相关阅读:
    我的后端开发书架2015 2.0版
    Java根据字节数据判断文件类型
    基于lucene的案例开发:查询语句创建PackQuery
    Web 前沿——HTML5 Form Data 对象的使用
    基于HTML5的可预览多图片Ajax上传
    【面试】Spring问答Top 25
    【劳动节江南白衣Calvin 】我的后端开发书架2015
    【转载】Java 动态代理
    使用iframe给页面的localStorage扩容
    js中的||和&&使用技巧
  • 原文地址:https://www.cnblogs.com/a294098789/p/5627861.html
Copyright © 2020-2023  润新知