責(zé)任鏈模式是一種對象的行為模式。在責(zé)任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞措左,直到鏈上的某一個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求避除,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任怎披。
在以下條件下可考慮使用Chain of Responsibility:
- 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定瓶摆。
- 你想在不明確指定接受者的情況下凉逛,想過個對象
中的一個提交一個請求。 - 可處理一個請求的對象集合應(yīng)該被動態(tài)指定群井。
優(yōu)點: 1状飞、降低耦合度。它將請求的發(fā)送者和接收者解耦书斜。 2诬辈、簡化了對象。使得對象不需要知道鏈的結(jié)構(gòu)荐吉。 3焙糟、增強給對象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動它們的次序样屠,允許動態(tài)地新增或者刪除責(zé)任酬荞。 4搓劫、增加新的請求處理類很方便。
缺點: 1混巧、不能保證請求一定被接收。 2勤揩、系統(tǒng)性能將受到一定影響咧党,而且在進行代碼調(diào)試時不太方便,可能會造成循環(huán)調(diào)用陨亡。 3傍衡、可能不容易觀察運行時的特征,有礙于除錯负蠕。
使用場景: 1蛙埂、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定遮糖。 2绣的、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求欲账。 3屡江、可動態(tài)指定一組對象處理請求。
public interface Handler {
void operator();
}
public abstract class AbstractHandler {
private Handler handler;
public Handler getHandler() {
return handler;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
}
public class MyHandler1 extends AbstractHandler implements Handler {
@Override
public void operator() {
System.out.println(this.getClass().getSimpleName()+" operate");
if(getHandler()!=null){
getHandler().operator();
}
}
}
public class MyHandler2 extends AbstractHandler implements Handler {
@Override
public void operator() {
System.out.println(this.getClass().getSimpleName()+" operate");
if(getHandler()!=null){
getHandler().operator();
}
}
}
public class MyHandler3 extends AbstractHandler implements Handler {
@Override
public void operator() {
System.out.println(this.getClass().getSimpleName()+" operate");
if(getHandler()!=null){
getHandler().operator();
}
}
}
@Test
public void testChainOfResponsibility() {
MyHandler1 h1 = new MyHandler1();
MyHandler2 h2 = new MyHandler2();
MyHandler3 h3 = new MyHandler3();
h1.setHandler(h2);
h2.setHandler(h3);
h1.operator();
}
MyHandler1 operate
MyHandler2 operate
MyHandler3 operate