責任鏈模式 使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈檢查該請求,並對其進行處理,或者將它傳遞給下一個對象。 責任鏈模式有兩個角色組成: 抽象處理者角色:它定義了一個處理請求的介面。當然對於鏈子的不同實現,也可以在這個角色中實現後繼鏈。 ...
責任鏈模式 使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈檢查該請求,並對其進行處理,或者將它傳遞給下一個對象。 責任鏈模式有兩個角色組成: 抽象處理者角色:它定義了一個處理請求的介面。當然對於鏈子的不同實現,也可以在這個角色中實現後繼鏈。 具體處理者角色:實現抽象處理者定義的介面,並處理它所負責的請求。
下麵是《設計模式》中給出的適用範圍:
1) 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
2) 你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
3) 可處理一個請求的對象集合應被動態指定。
責任鏈模式又有純與不純的區別。
純的責任鏈模式,規定一個具體處理者角色只能對請求作出兩種動作:自己處理;傳給下家。不能出現處理了一部分,把剩下的傳給了下家的情況。而且請求在責任鏈中必須被處理,而不能出現無果而終的結局。反之,則就是不純的責任鏈模式。 在一個純的責任鏈模式裡面,一個請求必須被某一個處理者對象所接收;在一個不純的責任鏈模式裡面,一個請求可以最終不被任何接收端對象所接收。/** * 持有下一個處理請求的對象 */ public abstract class Handler { protected Handler handler; /** * 具體處理方法 */ protected abstract int handler(int num); public Handler getHandler() { return handler; } /** * 設置下一個處理請求的對象 */ public void setHandler(Handler handler){ this.handler = handler; } } |
public class AuditHandler extends Handler{ @Override protected int handler(int num) { num++; System.out.println("audit......"+ num); return getHandler().handler(num); } } |
public class CleanHandler extends Handler{ @Override protected int handler(int num) { num++; System.out.println("clean......"+ num); return getHandler().handler(num); } } |
public class MatchHandler extends Handler{ @Override protected int handler(int num) { num++; System.out.println("match......"+ num); return num; } } |
public class Client { public static void main(String[] args) { Handler audit = new AuditHandler(); Handler clean = new CleanHandler(); Handler match = new MatchHandler(); audit.setHandler(clean); clean.setHandler(match); audit.handler(0); } } |