37职责链模式(Chain of Responsibility Pattern)
動機(Motivate):
??? 在軟件構建過程中,一個請求可能被多個對象處理,但是每個請求在運行時只能有一個接受者,如果顯示指定,將必不可少地帶來請求發送者與接受者的緊耦合。
??? 如何使請求的發送者不需要指定具體的接受者?讓請求的接受者自己在運行時決定來處理請求,從而使兩者解耦。
意圖(Intent):
??? 使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
結構圖(Struct):
??? ?? ?? ???
適用性:
??? 1.有多個對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
??? 2.你想在不明確接收者的情況下,向多個對象中的一個提交一個請求。
??? 3.可處理一個請求的對象集合應被動態指定。
生活中的例子:
??? ???????????
代碼實現:
??? ?? ???
?1?????//Handler
?2????abstract?class?Approver
?3?????{
?4????????protected?Approver?successor;
?5????????public?void?SetSuccessor(Approver?successor)
?6????????{
?7????????????this.successor?=?successor;
?8????????}
?9????????public?abstract?void?ProcessRequest(Purchase?purchase);
10?
11?????}
12?
13?
14?
?
?1?????//ConcreteHandler
?2?????class?Director?:Approver
?3?????{
?4?????????public?override?void?ProcessRequest(Purchase?purchase)
?5?????????{
?6?????????????if?(purchase.Amount?<?10000.0)
?7?????????????{
?8?????????????????Console.WriteLine("{0}?approved?request#?{1}",?this.GetType().Name,?purchase.Number);
?9?
10?????????????}
11?????????????else?if(successor?!=null)
12?????????????{
13?????????????????successor.ProcessRequest(purchase);
14?????????????}
15?????????}
16?????}
?
?1?
?2?
?3?
?4?????class?VicePresident?:Approver
?5?????{
?6?????????public?override?void?ProcessRequest(Purchase?purchase)
?7?????????{
?8?????????????if?(purchase.Amount?<?25000.0)
?9?????????????{
10?????????????????Console.WriteLine("{0}?approved?request#?{1}",?this.GetType().Name,?purchase.Number);
11?
12?????????????}
13?????????????else?if?(successor?!=?null)
14?????????????{
15?????????????????successor.ProcessRequest(purchase);
16?????????????}
17?????????}
18?????}
?
?1?
?2?????class?President?:Approver
?3?????{
?4?????????public?override?void?ProcessRequest(Purchase?purchase)
?5?????????{
?6?????????????if?(purchase.Amount?<?100000.0)
?7?????????????{
?8?????????????????Console.WriteLine("{0}?approved?request#?{1}",?this.GetType().Name,?purchase.Number);
?9?
10?????????????}
11?????????????else
12?????????????{
13?????????????????Console.WriteLine("Request!?{0}?requires?an?executive?meeting!",?purchase.Number);
14?????????????}
15?????????}
16?????}
?
?1?
?2?
?3?????//Request?details
?4?????class?Purchase
?5?????{
?6?????????private?int?number;
?7?????????private?double?amount;
?8?????????private?string?purpose;
?9?
10?????????//Constructor
11?????????public?Purchase(int?number,?double?amount,?string?purpose)
12?????????{
13?????????????this.number?=?number;
14?????????????this.amount?=?amount;
15?????????????this.purpose?=?purpose;
16?????????}
17?????????//Properties
18?????????public?double?Amount
19?????????{
20?????????????get?{?return?amount;?}
21?????????????set?{?amount?=?value;?}
22?????????}
23?????????public?string?Purpose
24?????????{
25?????????????get?{?return?purpose;?}
26?????????????set?{?purpose?=?value;?}
27?????????}
28?????????public?int?Number
29?????????{
30?????????????get?{?return?number;?}
31?????????????set?{?number?=?value;?}
32?????????}
33?????}
客戶端調用如下:
?1?
?2?????class?Program
?3?????{
?4?????????static?void?Main(string[]?args)
?5?????????{
?6?????????????//Setup?Chain?of?Responsibility
?7?????????????Director?Larry?=?new?Director();
?8?????????????VicePresident?Sam?=?new?VicePresident();
?9?????????????President?Tammy?=?new?President();
10?????????????Larry.SetSuccessor(Sam);
11?????????????Sam.SetSuccessor(Tammy);
12?
13?????????????//Generate?and?process?purchase?requests
14?????????????Purchase?p?=?new?Purchase(1034,?350.00,?"Supplies");
15?????????????Larry.ProcessRequest(p);
16?
17?????????????p?=?new?Purchase(2035,?32590.10,?"Project?X");
18?????????????Larry.ProcessRequest(p);
19?
20?????????????p?=?new?Purchase(2036,?122100.00,?"Project?Y");
21?????????????Larry.ProcessRequest(p);
22?
23?????????????//Wait?for?user
24?????????????Console.Read();
25?????????}
26?????}
運行結果如下:
??? ? ? ? ? ???
Chain of Responsibility實現要點:
??? 1.Chain of Responsibility模式的應用場合在于“一個請求可能有多個接受者,但是最后真正的接受者只胡一個”,只有這時候請求發送者與接受者的耦合才胡可能出現“變化脆弱”的癥狀,職責鏈的目的就是將二者解耦,從而更好地應對變化。
??? 2.應用了Chain of Responsibility模式后,對象的職責分派將更具靈活性。我們可以在運行時動態添加/修改請求的處理職責。
??? 3.如果請求傳遞到職責鏈的未尾仍得不到處理,應該有一個合理的缺省機制。這也是每一個接受對象的責任,而不是發出請求的對象的責任。
總結
以上是生活随笔為你收集整理的37职责链模式(Chain of Responsibility Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】OneDrive开发入门
- 下一篇: 三季度国债发行计划公布,储蓄国债发行日确