zoukankan      html  css  js  c++  java
  • 【GOF23设计模式】责任链模式

    来源:http://www.bjsxt.com/ 
    一、【GOF23设计模式】_责任链模式、公文审批、供应链系统的采购审批、异常链、过滤器和拦截器调用过程

    结构型模式汇总

    行为型模式

    行为型模式汇总

    定义

    场景1

    场景2

    场景3

    请假条审批流程案例

     1 package com.test.chainOfResp;
     2 /**
     3  * 封装请假的基本信息
     4  */
     5 public class LeaveRequest {
     6     private String empName;
     7     private int leaveDays;
     8     private String reason;
     9 
    10     public LeaveRequest(String empName, int leaveDays, String reason) {
    11         super();
    12         this.empName = empName;
    13         this.leaveDays = leaveDays;
    14         this.reason = reason;
    15     }
    16 
    17     public String getEmpName() {
    18         return empName;
    19     }
    20 
    21     public void setEmpName(String empName) {
    22         this.empName = empName;
    23     }
    24 
    25     public int getLeaveDays() {
    26         return leaveDays;
    27     }
    28 
    29     public void setLeaveDays(int leaveDays) {
    30         this.leaveDays = leaveDays;
    31     }
    32 
    33     public String getReason() {
    34         return reason;
    35     }
    36 
    37     public void setReason(String reason) {
    38         this.reason = reason;
    39     }
    40 }
     1 package com.test.chainOfResp;
     2 /**
     3  * 抽象类
     4  */
     5 public abstract class Leader {
     6     protected String name;
     7     protected Leader nextLeader;//责任链上的后继对象
     8 
     9     public Leader(String name) {
    10         super();
    11         this.name = name;
    12     }
    13     //设定责任链上的后继对象
    14     public void setNextLeader(Leader nextLeader) {
    15         this.nextLeader = nextLeader;
    16     }
    17 
    18     /**
    19      * 处理请求的核心的业务方法
    20      * @param leaveRequest
    21      */
    22     public abstract void handleRequest(LeaveRequest leaveRequest);
    23 }
     1 package com.test.chainOfResp;
     2 /**
     3  * 主任
     4  */
     5 public class Director extends Leader{
     6 
     7     public Director(String name) {
     8         super(name);
     9     }
    10 
    11     @Override
    12     public void handleRequest(LeaveRequest leaveRequest) {
    13         if(leaveRequest.getLeaveDays() < 3){
    14             System.out.println("员工:"+leaveRequest.getEmpName()+"请假,天数:"+leaveRequest.getLeaveDays()+",理由:"+leaveRequest.getReason());
    15             System.out.println("主任:"+this.name+",审批通过!");
    16         }else{
    17             if(this.nextLeader != null){
    18                 this.nextLeader.handleRequest(leaveRequest);
    19             }
    20         }
    21     }
    22 }
     1 package com.test.chainOfResp;
     2 /**
     3  * 经理
     4  */
     5 public class Manager extends Leader{
     6 
     7     public Manager(String name) {
     8         super(name);
     9     }
    10 
    11     @Override
    12     public void handleRequest(LeaveRequest leaveRequest) {
    13         if(leaveRequest.getLeaveDays() < 10){
    14             System.out.println("员工:"+leaveRequest.getEmpName()+"请假,天数:"+leaveRequest.getLeaveDays()+",理由:"+leaveRequest.getReason());
    15             System.out.println("经理:"+this.name+",审批通过!");
    16         }else{
    17             if(this.nextLeader != null){
    18                 this.nextLeader.handleRequest(leaveRequest);
    19             }
    20         }
    21     }
    22 }
     1 package com.test.chainOfResp;
     2 /**
     3  * 总经理
     4  */
     5 public class GeneralManager extends Leader{
     6 
     7     public GeneralManager(String name) {
     8         super(name);
     9     }
    10 
    11     @Override
    12     public void handleRequest(LeaveRequest leaveRequest) {
    13         if(leaveRequest.getLeaveDays() < 30){
    14             System.out.println("员工:"+leaveRequest.getEmpName()+"请假,天数:"+leaveRequest.getLeaveDays()+",理由:"+leaveRequest.getReason());
    15             System.out.println("总经理:"+this.name+",审批通过!");
    16         }else{
    17             System.out.println("莫非"+leaveRequest.getEmpName()+"想辞职,居然请假"+leaveRequest.getLeaveDays()+"天!");
    18         }
    19     }
    20 }
     1 package com.test.chainOfResp;
     2 /**
     3  * 副总经理
     4  */
     5 public class ViceGeneralManager extends Leader{
     6 
     7     public ViceGeneralManager(String name) {
     8         super(name);
     9     }
    10 
    11     @Override
    12     public void handleRequest(LeaveRequest leaveRequest) {
    13         if(leaveRequest.getLeaveDays() < 20){
    14             System.out.println("员工:"+leaveRequest.getEmpName()+"请假,天数:"+leaveRequest.getLeaveDays()+",理由:"+leaveRequest.getReason());
    15             System.out.println("副总经理:"+this.name+",审批通过!");
    16         }else{
    17             if(this.nextLeader != null){
    18                 this.nextLeader.handleRequest(leaveRequest);
    19             }
    20         }
    21     }
    22 }
     1 package com.test.chainOfResp;
     2 
     3 public class Client {
     4     public static void main(String[] args) {
     5         Leader a = new Director("张三");
     6         Leader b = new Manager("李四");
     7         Leader b2 = new ViceGeneralManager("李小四");//新增逻辑,副总经理
     8         Leader c = new GeneralManager("王五");
     9 
    10         //组织责任链对象的关系
    11         a.setNextLeader(b);
    12         b.setNextLeader(b2);//新增关系
    13         b2.setNextLeader(c);
    14 
    15         //开始请假操作
    16         LeaveRequest leaveRequest = new LeaveRequest("Tom", 15, "回英国老家探亲!");
    17         a.handleRequest(leaveRequest);
    18 
    19     }
    20 }
    控制台输出:
    员工:Tom请假,天数:15,理由:回英国老家探亲!
    副总经理:李小四,审批通过!

    添加新的处理对象

    链表方式定义职责链

    开发中常见的场景

  • 相关阅读:
    vim字体设置
    windows下eclipse打不开
    ubuntu的无线网无法连上
    将ubuntu系统录到u盘上
    使用UltraISO刻录系统到U盘可能会出现打不开的情况
    windows安装程序制作
    安装ubuntu双系统
    数据库插入数据时间比较
    LeetCode 189. Rotate Array
    LeetCode 228. Summary Ranges
  • 原文地址:https://www.cnblogs.com/erbing/p/5802581.html
Copyright © 2011-2022 走看看