【設計模式】責任鏈模式

責任鏈模式


2019-11-10  19:28:21  by沖沖編程

 

一、概念

案例:員工要報銷8000元,公司規定2000元如下不用簽字,2000~5000元須要部門主管簽字,5000元以上須要總裁簽字。app

設計:三個審批人應該繼承同一個抽象類,抽象類定義兩個方法。①報銷簽字方法approve(),②審批人持有上層領導的引用,若是本身不能處理則提交領導處理setApprover()。ide

特色:審批人(環)只懂本身怎麼審批(責任),處理不了的就遞交給上層(鏈條)。this

 

二、完整代碼

 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 }
相關文章
相關標籤/搜索