• 【设计模式】责任链模式


    责任链模式


    2019-11-10  19:28:21  by冲冲

    1、概念

    案例:员工要报销8000元,公司规定2000元以下不用签字,2000~5000元需要部门主管签字,5000元以上需要总裁签字。

    设计:三个审批人应该继承同一个抽象类,抽象类定义两个方法。①报销签字方法approve(),②审批人持有上层领导的引用,如果自己不能处理则提交领导处理setApprover()。

    特点:审批人(环)只懂自己怎么审批(责任),处理不了的就递交给上层(链条)。

    2、完整代码

     1 abstract class Approver {// 审批人抽象类
     2     protected String name;// 抽象出审批人的姓名。
     3     protected Approver nextApprover;// 下一个审批人,更高级别领导。
     4     public Approver(String name) {
     5         this.name = name;
     6     }
     7     protected Approver setNextApprover(Approver nextApprover) {
     8         this.nextApprover = nextApprover;
     9         return this.nextApprover;// 返回下个审批人,链式编程。
    10     }
    11     public abstract void approve(int amount);// 抽象审批方法由具体审批人子类实现
    12 }
    13 
    14 class Staff extends Approver {
    15     public Staff(String name) {
    16         super(name);
    17     }
    18     @Override
    19     public void approve(int amount) {
    20         if (amount <= 1000) {
    21             System.out.println("审批通过。【员工:" + name + "】");
    22         } else {
    23             System.out.println("无权审批,升级处理。【员工:" + name + "】");
    24             this.nextApprover.approve(amount);
    25           }
    26   }
    27 }
    28 
    29 class Manager extends Approver {
    30     public Manager(String name) {
    31         super(name);
    32     }
    33     @Override
    34     public void approve(int amount) {
    35         if (amount <= 5000) {
    36             System.out.println("审批通过。【经理:" + name + "】");
    37         } else {
    38             System.out.println("无权审批,升级处理。【经理:" + name + "】");
    39             this.nextApprover.approve(amount);
    40         }
    41     }
    42 }
    43 
    44 class CEO extends Approver {
    45     public CEO(String name) {
    46         super(name);
    47     }
    48     @Override
    49     public void approve(int amount) {
    50         if (amount <= 10000) {
    51             System.out.println("审批通过。【CEO:" + name + "】");
    52         } else {
    53             System.out.println("驳回申请。【CEO:" + name + "】");
    54         }
    55     }
    56 }
    57 
    58 public class Chain {
    59     public static void main(String[] args) {
    60         Approver ring = new Staff("张飞");
    61         ring.setNextApprover(new Manager("关羽")).setNextApprover(new CEO("刘备"));
    62 
    63         //高层接触不到也没必要接触,直接找员工张飞审批。
    64         ring.approve(1000);
    65         /***********************
    66         审批通过。【员工:张飞】
    67         ***********************/
    68 
    69         ring.approve(4000);
    70         /***********************
    71         无权审批,升级处理。【员工:张飞】
    72         审批通过。【经理:关羽】
    73         ***********************/
    74 
    75         ring.approve(9000);
    76         /***********************
    77         无权审批,升级处理。【员工:张飞】
    78         无权审批,升级处理。【经理:关羽】
    79         审批通过。【CEO:刘备】
    80         ***********************/
    81         
    82         ring.approve(88000);
    83         /***********************
    84         无权审批,升级处理。【员工:张飞】
    85         无权审批,升级处理。【经理:关羽】
    86         驳回申请。【CEO:刘备】
    87         ***********************/
    88     }
    89 }
  • 相关阅读:
    编译安装php5 解决编译安装的php加载不了gd
    apache-php
    使用ab对网站进行压力测试
    正则表达式实例 -- 匹配Windows消息宏
    SDK 操作 list-view control 实例 -- 遍历进程
    malloc/free、new/delete 区别
    Python实例 -- 爬虫
    multimap实例 -- 添加、遍历数据
    CListCtrl 扩展风格设置方法---SetExtendedStyle和ModifyStyleEx
    创建指定大小的空文件
  • 原文地址:https://www.cnblogs.com/yadiel-cc/p/11831533.html
Copyright © 2020-2023  润新知