[TOC]
一腹尖、行為型模式
介紹職責(zé)鏈模式之前先介紹一下行為型設(shè)計模式费坊,因為按照GoF模式分類事格,職責(zé)鏈就是一種行為型設(shè)計模式。行為型設(shè)計模式就是主要表示類或者對象之間的關(guān)聯(lián)關(guān)系锈至,分為類行為型和對象行為型晨缴。類行為型一般都是通過類的繼承或者多態(tài)等等方式實現(xiàn)。對象行為型就是通過對象的聚合等等關(guān)聯(lián)實現(xiàn)峡捡。
二击碗、職責(zé)鏈模式定義
職責(zé)鏈模式是一種對象行為型模式筑悴。根據(jù)“合成復(fù)用”原則,盡量使用關(guān)聯(lián)來取代類繼承稍途,對象行為型可以說是一種不錯的行為型模式阁吝。
職責(zé)鏈模式是一種將請求的發(fā)送者和請求處理者分離的一種模式。職責(zé)鏈可以是線型械拍、環(huán)型或者樹形的突勇,不需要關(guān)系請求處理的細(xì)節(jié),只要將請求沿著路徑發(fā)送就好坷虑,做到了請求發(fā)送者和請求處理者解耦甲馋。
引用一下
Chain of Responsibility Pattern: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
翻譯過來就是:
職責(zé)鏈模式:通過給予多個對象處理請求的機(jī)會,避免將請求的發(fā)送方與接收方耦合迄损。將接收對象鏈接起來定躏,并沿著鏈傳遞請求,直到對象處理它芹敌。
三痊远、職責(zé)鏈模式角色
職責(zé)鏈模式包括下面幾種角色:
- Handler:抽象處理者
- ConcreteHandler:具體處理者
- Client:客戶端
上面已經(jīng)說了請求發(fā)送者和請求處理者,其實請求發(fā)送者就是客戶端氏捞,請求處理者就是ConcreteHandler拗引,也就是說,Client只是需要什么業(yè)務(wù)請求的就發(fā)送而已幌衣,完全可以對ConcreteHandler請求處理者改造矾削,而不影響到Client,也就是前面所說的做到了請求發(fā)送者和請求處理者的解耦豁护。
四哼凯、簡單實例
例子參考:《設(shè)計模式》一書
抽象類:
public abstract class Handler
{
protected Handler nextHandler;
public void setNextHandler(Handler nextHandler)
{
this.nextHandler=nextHandler;
}
public abstract void handleRequest(String request);
}
具體實現(xiàn)者:
public class ConcreteHandler extends Handler
{
public void handleRequest(String request)
{
if(請求request滿足條件)
{
...... //處理請求;
}
else
{
this.nextHandler.handleRequest(request); //轉(zhuǎn)發(fā)請求
}
}
}
客戶端調(diào)用:
public class Client
{
public static void main(String args[])
{
Handler handler1 = new ConcreteHandler();
handler handler2 = new ConcreteHandler();
handler1.setNextHandler(handler2);
handler1.handleRequest("test");
}
}
網(wǎng)上這個例子也寫的還可以楚里,可以參考學(xué)習(xí)
http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
五断部、模式應(yīng)用
在Java中的異常處理機(jī)制
try
{
……
}catch(IOException e3){
……
}finally{
……
}
Mybatis Plugin 插件(攔截器)的應(yīng)用,也是用動態(tài)代理和職責(zé)鏈模式進(jìn)行設(shè)計和實現(xiàn)的:
可以看一下博客:http://www.reibang.com/p/b82d0a95b2f3