• 第二节:职责链模式——基本介绍&应用


    一、职责链模式

      1、基本介绍

        (1)职责链模式(Chain of Responsibility Pattern),又叫责任链模式,为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接受者进行解耦。

          

        (2)职责链模式通常每个接收者对象都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依次类推。

        (3)这种类型的设计模式属于行为型模式;

      2、原理类图

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

        

         对原理类图的说明——即(职责链模式的角色及职责)

        (1)Handler:抽象的处理者,定义了一个处理请求的接口,同时包含另外一个 Handler;

        (2)ConcreteHandlerA,B 是具体的处理者,处理它自己负责的请求,可以访问它的后继者(即下一个处理者),如果可以处理当前请求,则处理,否则就将该请求交给 后继者去处理,从而形成一个职责链;

        (3)Request:含有很多属性,表示一个请求;

    二、职责链模式完成OA系统采购审批

      1、思路分析和图解(类图)

        

      2、代码实现

        抽象审批类:

     1 /**
     2  * 抽象的审批者
     3  */
     4 public abstract class Approver {
     5 
     6     //下一个处理者
     7     Approver approver;
     8 
     9     //名字
    10     String name;
    11 
    12     public Approver(String name) {
    13         this.name = name;
    14     }
    15 
    16     /**
    17      * 下一个处理者
    18      * @param approver
    19      */
    20     public void setApprover(Approver approver) {
    21         this.approver = approver;
    22     }
    23 
    24 
    25     /**
    26      * 处理审批请求的方法,得到一个请求,
    27      * 处理是子类完成,因此该方法做成抽象
    28      * @param purchaseRequest
    29      */
    30     public abstract void process(PurchaseRequest purchaseRequest);
    31 }

        各个审批者(处理实现类):

     1 public class DepartmentApprover extends Approver {
     2 
     3 
     4     public DepartmentApprover(String name) {
     5         super(name);
     6     }
     7 
     8     @Override
     9     public void process(PurchaseRequest purchaseRequest) {
    10         if (purchaseRequest.getPrice() <= 5000) {
    11             System.out.println("请求编号 id=" + purchaseRequest.getId() + "被" + this.name + "处理了。");
    12         } else {
    13             approver.process(purchaseRequest);
    14         }
    15     }
    16 }
    17 ------------------------------------------------------------------
    18 public class CollegeApprover extends Approver{
    19 
    20     public CollegeApprover(String name) {
    21         super(name);
    22     }
    23 
    24     @Override
    25     public void process(PurchaseRequest purchaseRequest) {
    26         if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 10000) {
    27             System.out.println("请求编号 id=" + purchaseRequest.getId() + "被" + this.name + "处理了。");
    28         } else {
    29             approver.process(purchaseRequest);
    30         }
    31     }
    32 }
    33 ------------------------------------------------------------------
    34 public class ViceSchoolMasterApprover extends Approver{
    35     public ViceSchoolMasterApprover(String name) {
    36         super(name);
    37     }
    38 
    39     @Override
    40     public void process(PurchaseRequest purchaseRequest) {
    41         if (purchaseRequest.getPrice() > 10000 && purchaseRequest.getPrice() <= 30000) {
    42             System.out.println("请求编号 id=" + purchaseRequest.getId() + "被" + this.name + "处理了。");
    43         } else {
    44             approver.process(purchaseRequest);
    45         }
    46     }
    47 }
    48 ------------------------------------------------------------------
    49 public class SchoolMasterApprover extends Approver{
    50 
    51     public SchoolMasterApprover(String name) {
    52         super(name);
    53     }
    54 
    55     @Override
    56     public void process(PurchaseRequest purchaseRequest) {
    57         if (purchaseRequest.getPrice() > 30000) {
    58             System.out.println("请求编号 id=" + purchaseRequest.getId() + "被" + this.name + "处理了。");
    59         } else {
    60             approver.process(purchaseRequest);
    61         }
    62     }
    63 }

        请求类:

     1 /**
     2  * 请求类
     3  */
     4 public class PurchaseRequest {
     5 
     6     //请求类型
     7     private int type = 0;
     8 
     9     //请求金额
    10     private float price = 0.0f;
    11 
    12     private int id = 0;
    13 
    14     /**
    15      * 构造器
    16      * @param type
    17      * @param price
    18      * @param id
    19      */
    20     public PurchaseRequest(int type, float price, int id) {
    21         this.type = type;
    22         this.price = price;
    23         this.id = id;
    24     }
    25 
    26     public int getType() {
    27         return type;
    28     }
    29 
    30     public float getPrice() {
    31         return price;
    32     }
    33 
    34     public int getId() {
    35         return id;
    36     }
    37 }

        客户端:

     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         //创建一个请求
     5         PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000, 1);
     6 
     7         //创建相关的审核者
     8         DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
     9 
    10         CollegeApprover collegeApprover = new CollegeApprover("李院长");
    11 
    12         ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副院长");
    13 
    14         SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("黄校长");
    15 
    16 
    17         //需要将各个审批级别的下一个审批者处理好(处理人构成环形:)
    18         departmentApprover.setApprover(collegeApprover);
    19         collegeApprover.setApprover(viceSchoolMasterApprover);
    20         viceSchoolMasterApprover.setApprover(schoolMasterApprover);
    21         schoolMasterApprover.setApprover(departmentApprover);
    22 
    23 
    24         departmentApprover.process(purchaseRequest);
    25 
    26 
    27     }
    28 }

     

     

  • 相关阅读:
    windows server 2012 流媒体服务器搭建(直播与点播)
    开源的电商 B2C、B2B2C 电商系统-关于shopnc版权问题处处是陷阱啊
    windows远程桌面无法粘贴复制的问题解决方法
    通过$.ajax设置预加载动画加强用户体验
    怎么样抢注新域名
    某些浏览器具有dns缓存功能,大家更改域名指向,建议清理下浏览器缓存
    jQuery的on绑定事件在mobile safari(iphone / ipad / ipod)上无法使用的解决方案
    sqlserver Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应
    解决jQuery ajax动态新增节点无法触发点击事件的问题
    php递归函数中使用return的注意事项
  • 原文地址:https://www.cnblogs.com/niujifei/p/14489994.html
Copyright © 2020-2023  润新知