生活随笔
收集整理的這篇文章主要介紹了
『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
23種設(shè)計(jì)模式+額外常用設(shè)計(jì)模式匯總 (持續(xù)更新)
問(wèn)題抽象
客戶端發(fā)出一個(gè)請(qǐng)求,會(huì)有很多對(duì)象都可以來(lái)處理這個(gè)請(qǐng)求,而且不同對(duì)象的處理邏輯是不一樣的。
對(duì)于客戶端而言,無(wú)所謂誰(shuí)來(lái)處理,反正有對(duì)象處理就可以了。而且在上述處理中,還希望處理流程是可以靈活變動(dòng)的,而處理請(qǐng)求的對(duì)象需要能方便地修改或者是被替換掉,以適應(yīng)新的業(yè)務(wù)功能的需要。
職責(zé)鏈模式
十多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這個(gè)對(duì)象連城一條鏈,并沿著這條鏈傳遞該請(qǐng)求,知道有一個(gè)對(duì)象處理它為止。
模式結(jié)構(gòu)
-
抽象處理者(Handler)角色
定義出一個(gè)處理請(qǐng)求的接口。如果需要,接口可以定義出一個(gè)方法以設(shè)定和返回對(duì)下家的引用。這個(gè)角色通常由一個(gè)抽象類(lèi)或接口實(shí)現(xiàn)。
-
具體處理者(ConcreteHandler)角色
具體處理者接到請(qǐng)求后,可以選擇將請(qǐng)求處理掉,或者將請(qǐng)求傳給下家。由于具體處理者持有對(duì)下家的引用,因此,如果需要,具體處理者司以訪問(wèn)下家。
處理過(guò)程
ConcreteHandler將自己的后繼對(duì)象(向下傳遞消息的對(duì)象)記錄在自己的后繼表中,當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),ConcreteHandler會(huì)先檢查看自己有沒(méi)有匹配的處理程序,如果有就自己處理,否則傳遞給它的后繼。
職責(zé)鏈模式降低了請(qǐng)求的發(fā)送端和接收端之間的耦合,使多個(gè)對(duì)象都有機(jī)會(huì)處理這個(gè)請(qǐng)求。
優(yōu)點(diǎn)
請(qǐng)求者和接收者松散耦合
動(dòng)態(tài)組合職責(zé)
缺點(diǎn)
產(chǎn)生很多細(xì)粒度對(duì)象
不一定能被處理:需要提供默認(rèn)處理
本質(zhì)
分離職責(zé),動(dòng)態(tài)組合,如果學(xué)習(xí)過(guò)狀態(tài)模式,可以理解為可以動(dòng)態(tài)設(shè)置轉(zhuǎn)移方向的狀態(tài)模式。
狀態(tài)模式是一個(gè)對(duì)象的內(nèi)在狀態(tài)發(fā)生改變,一個(gè)對(duì)象,相對(duì)比較穩(wěn)定,處理完一個(gè)對(duì)象下一個(gè)對(duì)象的處理一般都已確定
職責(zé)鏈模式過(guò)于靈話,在客戶端使用時(shí),需要環(huán)境去確定下一個(gè)對(duì)象是誰(shuí),一些列的set操作…職責(zé)鏈模式是多個(gè)對(duì)象之間的改變,就會(huì)出現(xiàn)某個(gè)對(duì)象不存在的情景。
實(shí)現(xiàn):
我們使用百度百科的一個(gè)例子:
public class Request
{private string requestType
;public String getrequestType ()
{ return requestType
; }public void setrequestType (string requestType)
{ this.requestType
=requestType
; }private string requestContent
;public String getrequestContent ()
{ return requestContent
; }public void setrequestContent (string requestContent)
{ this.requestContent
=requestContent
; }private int number
;public int Number
{get
{ return number
; }set
{ number
= value
; }}
}
abstract public class Manager
{protected string name
;protected Manager superior
;public Manager(string name
){this.name
= name
;}public void SetSuperior(Manager superior
){this.superior
= superior
;}abstract public void RequestApplications(Request request
);
}
public class CommonManager extends Manager
{public CommonManager(string name
) { super(name
);}publicvoid
RequestApplications(Request request
){if (request
.RequestType
== "請(qǐng)假" && request
.Number
<= 2){Console
.WriteLine("{0}:{1}數(shù)量{2}被批準(zhǔn)", name
, request
.RequestContent
, request
.Number
);}else{if (superior
!= null
)superior
.RequestApplications(request
);}}
}
public class Majordomo extends Manager
{public Majordomo(string name
) { super(name
);}public void RequestApplications(Request request
){if (request
.RequestType
== "請(qǐng)假" && request
.Number
<= 5){System
.out
.println( name
+":"+ request
.RequestContent
+"數(shù)量"+request
.Number
+"被批準(zhǔn)");}else{if (superior
!= null
)superior
.RequestApplications(request
);}}
}
public class GeneralManager extends Manager
{public GeneralManager(string name
) {super(name
); }publicvoid
RequestApplications(Request request
){if (request
.RequestType
== "請(qǐng)假"){System
.out
.println( name
+":"+ request
.RequestContent
+"數(shù)量"+request
.Number
+"被批準(zhǔn)");}else if (request
.RequestType
== "加薪"&&request
.Number
<=500){System
.out
.println( name
+":"+ request
.RequestContent
+"數(shù)量"+request
.Number
+"被批準(zhǔn)");}else if (request
.RequestType
== "加薪" && request
.Number
> 500){System
.out
.println( name
+":"+ request
.RequestContent
+"數(shù)量"+request
.Number
+"在說(shuō)吧");}}
}
public class Client
{public static void Main(string
[] args
){CommonManager jinli
= new CommonManager("張三");Majordomo zongjian
= new Majordomo("李四");GeneralManager zongjinli
= new GeneralManager("王五");jinli
.SetSuperior(zongjian
);zongjian
.SetSuperior(zongjinli
);Request request
= new Request();request
.RequestType
= "請(qǐng)假";request
.RequestContent
= "XX請(qǐng)假";request
.Number
= 1;jinli
.RequestApplications(request
);Request request2
= new Request();request
.RequestType
= "加薪";request
.RequestContent
= "XX加薪";request
.Number
= 500;jinli
.RequestApplications(request
);}
}
總結(jié)
以上是生活随笔為你收集整理的『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。