本文實例講述了Java經典設計模式之責任鏈模式。分享給大家供大家參考,具體如下:
責任鏈模式:多個對象由其對象對應下家的引用連成一條鏈,請求在這個鏈上傳遞,直到鏈上的某一個接收對象處理此請求。因為請求的客戶端并不知道鏈上最終是誰來處理這個請求,使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任,從而避免了請求發送者與請求處理者之間的耦合。
責任鏈械中涉及到三種角色:
1,抽象處理者角色
2,具體處理者角色
3,請求發送者
小例子:假設去買房子,買房子就需要砍價, 賣房的人職位不同,可以優惠的價格也不同,不同職位就可以形成一個處理請求的鏈。我們暫定: * 基層銷售員,只能優惠3% * 銷售經理:可以優惠5% * 銷售總監:可以優惠8% * 老板(Boss):優惠10%
直接上代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/** * 抽象處理者(Handler)角色:處理請求的接口。如果需要,接口可以定義 出一個方法以設定和返回對下家的引用。 * 這個角色通常由一個Java抽象類或者Java接口實現。抽象方法handlePriceRequest()規范了子類處理請求的操作。 * @date 2015-12-24 上午11:26:56 */ public abstract class RoomRateHandler { protected RoomRateHandler mHandler; //直接由子類繼承,用于傳遞請求 public void setPriceHandler(RoomRateHandler mHandler){ this .mHandler=mHandler; } //處理具體問題:處理價格請求 public abstract void handlePriceRequest( float discount); /** * 設置請求處理鏈的層次關系 ,獲取處理請求的對象 * @description: * @date 2015-12-24 上午11:51:54 */ public static RoomRateHandler cretateHandler(){ RoomRateHandler salesMan= new SalesMan(); RoomRateHandler salesManager= new SalesManager(); RoomRateHandler saleDirector= new SalesDirector(); RoomRateHandler topManager= new TopManager(); salesMan.setPriceHandler(salesManager); salesManager.setPriceHandler(saleDirector); saleDirector.setPriceHandler(topManager); return salesMan; } } |
具體處理者(SalesMan)角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * 具體處理者(SalesMan)角色:具體處理者(SalesDirector)角色:具體處理者收到請求后,可以選擇處理請求,也可以將請求傳給下家(上級)。 * 具體處理者都持有對鏈上下家(上級)對象的引用,因此具體處理者把請求傳遞下去。 * @description: * @date 2015-12-24 上午11:29:16 */ public class SalesMan extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount<= 0.03 ){ System.out.format( "%s批準了:%.3f%n" , "業務員" ,discount); } else { mHandler.handlePriceRequest(discount); } } } |
具體處理者(SalesManager)角色
1
2
3
4
5
6
7
8
9
10
|
public class SalesManager extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount<= 0.08 ){ System.out.format( "%s批準了:%.3f%n" , "銷售經理" ,discount); } else { mHandler.handlePriceRequest(discount); } } } |
具體處理者(SalesDirector )角色
1
2
3
4
5
6
7
8
9
10
|
public class SalesDirector extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount<= 0.05 ){ System.out.format( "%s批準了:%.3f%n" , "銷售總監" ,discount); } else { mHandler.handlePriceRequest(discount); } } } |
具體處理者(TopManager)角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 具體處理者(TopManager)角色:因為當前 角色已經處于鏈尾,所以是最終處理了。 * @description: * @author ldm * @date 2015-12-24 上午11:29:16 */ public class TopManager extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount <= 0.1 ) { System.out.format( "%s批準了:%.3f%n" , "老板" , discount); } else { System.out.format( "%s不同意:%.3f%n" , "老板" , discount); } } } |
請求發送者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * 發出請求的客戶(模擬買房子的人) * @description: * @author ldm * @date 2015-12-24 上午11:35:54 */ public class Customer { private RoomRateHandler mHandler; public void setPriceHandler(RoomRateHandler mHandler) { this .mHandler = mHandler; } public void requestDiscount( float discount) { mHandler.handlePriceRequest(discount); } public static void main(String[] args) { Customer customer = new Customer(); customer.setPriceHandler(RoomRateHandler.cretateHandler()); //獲取處理對象,站你面前的可能是老板,也可能是業務員... Random random = new Random(); for ( int i = 0 ; i < 8 ; i++) { // 隨機構造8個買房子的人 System.out.println(i + "---" ); customer.requestDiscount(random.nextFloat()/ 10 ); //處理價格(談判) } } } |
處理結果
如果要增加層級怎么辦呢?很簡單,比如增加銷售主管SalesSupervisor,我們只需要新建一個類SalesSupervisor extends RoomRateHandler,實現處理方法handlePriceRequest(float discount);同時不要忘記在RoomRateHandler類中cretateHandler()中設置好對應的層級鏈就可以啦。
希望本文所述對大家java程序設計有所幫助。