zoukankan      html  css  js  c++  java
  • 大话设计模式笔记(二十一)の职责链模式

    职责链模式

    定义

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

    UML图

    好处

    • 当客户提交一个请求时,请求是沿链传递直至有一个 ConcreteHandler 对象负责处理它
    • 接收者和发送者都没有对方的明确信息,且链中对象自己也并不知道链的结构。结果时职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持他所有的候选者接收者的引用。
    • 可以随时的增加或修改一个请求的结构,增强给对象指派职责的灵活性

    但需要注意的是:一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

    举个栗子

    员工申请加薪,需要走流程

    Talk is cheap, show me the code

    (屁话少说,放码过来)

    /**
     * 管理者
     * Created by callmeDevil on 2019/12/14.
     */
    public abstract class Manager {
    
        protected String name;
        // 上级
        protected Manager superior;
    
        public Manager(String name){
            this.name = name;
        }
    
        // 设置上级
        public void setSuperior(Manager superior){
            this.superior = superior;
        }
    
        // 申请请求
        public abstract void requestApplications(Request request);
    
    }
    
    /**
     * 经理
     * Created by callmeDevil on 2019/12/14.
     */
    public class CommonManager extends Manager {
    
        public CommonManager(String name) {
            super(name);
        }
    
        @Override
        public void requestApplications(Request request) {
            // 经理的权限可以批准2天内的假期
            if ("请假".equals(request.getRequestType()) && request.getNumber() <= 2) {
                System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
            } else {
                // 其余申请转交上级
                if (superior != null) {
                    superior.requestApplications(request);
                }
            }
        }
    
    }
    
    /**
     * 总监
     * Created by callmeDevil on 2019/12/14.
     */
    public class Majordomo extends Manager {
    
        public Majordomo(String name) {
            super(name);
        }
    
        @Override
        public void requestApplications(Request request) {
            // 总监的权限可以批准5天内的假期
            if ("请假".equals(request.getRequestType()) && request.getNumber() <= 5) {
                System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
            } else {
                // 其余申请转交上级
                if (superior != null) {
                    superior.requestApplications(request);
                }
            }
        }
    
    }
    
    /**
     * 总经理
     * Created by callmeDevil on 2019/12/14.
     */
    public class GeneralManager extends Manager {
    
        public GeneralManager(String name) {
            super(name);
        }
    
        @Override
        public void requestApplications(Request request) {
            // 总经理可以批准任意天的假期
            if ("请假".equals(request.getRequestType())) {
                System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
            }
            // 加薪在500内,没问题
            else if ("加薪".equals(request.getRequestType()) && request.getNumber() <= 500) {
                System.out.println(String.format("%s : %s 数量%s 被批准", name, request.getRequestContent(), request.getNumber()));
            }
            // 加薪超过500要考虑一下
            else if ("加薪".equals(request.getRequestType()) && request.getNumber() > 500) {
                System.out.println(String.format("%s : %s 数量%s 再说吧", name, request.getRequestContent(), request.getNumber()));
            }
        }
    
    }
    
    /**
     * 申请类
     * Created by callmeDevil on 2019/12/14.
     */
    public class Request {
    
        // 申请级别
        private String requestType;
        // 申请内容
        private String requestContent;
        // 数量
        private int number;
    
        // 省略get set
    }
    
    public class Test {
        public static void main(String[] args) {
            CommonManager commonManager = new CommonManager("中将");
            Majordomo majordomo = new Majordomo("大将");
            GeneralManager generalManager = new GeneralManager("元帅");
            // 设置上级
            commonManager.setSuperior(majordomo);
            majordomo.setSuperior(generalManager);
    
            Request request = new Request();
            request.setRequestType("请假");
            request.setRequestContent("不给请假我不干了");
            request.setNumber(1);
            commonManager.requestApplications(request); // 客户端的申请都是由经理发起的,但实际上决策是谁,客户端不知道
    
            Request request2 = new Request();
            request2.setRequestType("请假");
            request2.setRequestContent("不给请假我不干了");
            request2.setNumber(4);
            commonManager.requestApplications(request2);
    
            Request request3 = new Request();
            request3.setRequestType("加薪");
            request3.setRequestContent("不给加薪我不干了");
            request3.setNumber(500);
            commonManager.requestApplications(request3);
    
            Request request4 = new Request();
            request4.setRequestType("加薪");
            request4.setRequestContent("不给加薪我不干了");
            request4.setNumber(1000);
            commonManager.requestApplications(request4);
        }
    }
    

    运行结果

    中将 : 不给请假我不干了 数量1 被批准
    大将 : 不给请假我不干了 数量4 被批准
    元帅 : 不给加薪我不干了 数量500 被批准
    元帅 : 不给加薪我不干了 数量1000 再说吧
    
  • 相关阅读:
    使用js打开和关闭窗体的几种方法
    使用代码格式化word文档
    批量删除.svn文件的方法
    创业公司老板管理常识
    Google Chrome Source Code 浏览器源码(下载)
    uboot_smdkv210 分析七:Makefile详解
    uboot_smdkv210 分析四:启动代码汇编部分总结
    uboot_smdkv210 分析八:MMU地址映射
    uboot_smdkv210 分析六:内存分配
    uboot_smdkv210 分析五:硬件启动过程
  • 原文地址:https://www.cnblogs.com/call-me-devil/p/12040381.html
Copyright © 2011-2022 走看看