責任鏈模式
在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。
責任鏈模式的組成部份
1.抽象處理者 定義出一個處理請求的接口。如果需要,接口可以定義出一個方法,以設定和返回下家的引用。這個角色通常由一個Java抽象類或Java接口實現。
2.具體處理 具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于處理者持有下家引用,因此,如果需要,具體處理者可以訪問下家。
責任鏈模式組成部份之間的關系

一個例子:
1.抽象處理者
package responsibility;

public abstract class Handler
{
protected Handler nextHandler;
public abstract void handleRequest(String name);
public void setNextHandler(Handler handler)
{
this.nextHandler = handler;
}
}
2.寶玉
package responsibility;

/**
* <ul>
* <li>Title:[JiaBaoYu]</li>
* <li>Description: [賈寶玉]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class JiaBaoYu extends Handler
{
public void handleRequest(String name)
{
if("賈寶玉".equals(name))
{
System.out.println("賈寶玉表演節目");
}
else
{
System.out.println("賈寶玉傳把花遞給下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
林黛玉:
package responsibility;

/**
* <ul>
* <li>Title:[LinDaiYu]</li>
* <li>Description: [林戴玉]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class LinDaiYu extends Handler
{
public void handleRequest(String name)
{
if("林戴玉".equals(name))
{
System.out.println("林戴玉表演節目");
}
else
{
System.out.println("林戴玉把花傳遞給下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}
探春:
package responsibility;

/**
* <ul>
* <li>Title:[TanChun]</li>
* <li>Description: [探春]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class TanChun extends Handler
{
public void handleRequest(String name)
{
if ("探春".equals(name))
{
System.out.println("探春表演節目");
}
else
{
System.out.println("探春把花傳遞給下一位");
if (nextHandler != null)
{
nextHandler.handleRequest(name);
}
}
}
}
襲人:
package responsibility;

/**
* <ul>
* <li>Title:[XiRen]</li>
* <li>Description: [襲人]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-7-31]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class XiRen extends Handler
{
public void handleRequest(String name)
{
if("襲人".equals(name))
{
System.out.println("襲人表演節目");
}
else
{
System.out.println("襲人把花傳遞給下一位");
if (nextHandler != null)
{
this.nextHandler.handleRequest(name);
}
}
}
}


環境:
package responsibility;

public class Client
{
public static void main(String[] args)
{
// 賈寶玉
Handler jiabaoyu = new JiaBaoYu();
// 林黛玉
Handler lindaiyu = new LinDaiYu();
// 襲人
Handler xiren = new XiRen();
// 探春
Handler tanchun = new TanChun();
jiabaoyu.setNextHandler(lindaiyu);
lindaiyu.setNextHandler(xiren);
xiren.setNextHandler(tanchun);
jiabaoyu.handleRequest("賈寶玉");
}
}

純的與不純的責任鏈
在一個純的責任鏈模式里面,一個請求必須被某一個處理者對象所接收;在一個不純的責任鏈模式里面,一個請求可以最終不被任何接收端對象所接收。
在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使系統可以在不影響客戶端的情況下動態的重新組織鏈和分配責任。
責任鏈模式的組成部份
1.抽象處理者 定義出一個處理請求的接口。如果需要,接口可以定義出一個方法,以設定和返回下家的引用。這個角色通常由一個Java抽象類或Java接口實現。
2.具體處理 具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于處理者持有下家引用,因此,如果需要,具體處理者可以訪問下家。
責任鏈模式組成部份之間的關系

一個例子:
1.抽象處理者
















































































































































環境:
























純的與不純的責任鏈
在一個純的責任鏈模式里面,一個請求必須被某一個處理者對象所接收;在一個不純的責任鏈模式里面,一個請求可以最終不被任何接收端對象所接收。
責任鏈模式的優點
責任鏈模式非常顯著的優點是請求和處理分開。請求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌(例如在J2EE項目開發中,可以剝離出無狀態Bean由責任鏈處理),兩者解耦,提高系統的靈活性。
責任鏈模式的缺點
責任鏈有兩個非常顯著的缺點:一是性能問題,每個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,性能是一個非常大的問題。二是調試不是很方便,特別是鏈條比較長,環節比較多的時候,由于采用了類似遞歸的方式,調試的時候邏輯可能比較復雜。