廢話不多說,最近要期末考試了,還沒預習呢,下面直接進入正題。
定義:定義多個可以處理請求(承擔責任)的類,并將它們連成一條鏈,沿著該鏈向下傳遞請求(責任),直到有能力解決問題(承擔責任)的類處理之。這使得它們都有機會(看能力大小咯)處理請求。
使用場景:
1.
一個請求有多個類可以處理,但具體由那個類處理要在運行時刻確定;
1.
在請求不知道由誰來處理的時候,可以沿著責任鏈傳遞請求;
1.
需要動態指定一組對象處理請求。
優點:
- 使得請求者和處理者之前關系解耦,提高了代碼靈活性。
缺點:
- 影響程序的性能,尤其在遞歸調用中更為明顯,因為勢必要對鏈中的處理者遍歷,直到找到合適的處理者。
以游戲BOSS懸賞為例,發布一個懸賞,招能人義士消滅BOSS。
代碼實現:
懸賞 (請求)
~~~
/**
* 懸賞 ----->請求
* @author lt
*
*/
public class Reward {
/**
* BOSS戰斗力
*/
public int bossFightingCapacity;
}
~~~
游戲角色(處理者Handler)
~~~
/**
* 游戲角色 ---> 可以處理請求的處理者Handler
* @author lt
*
*/
public abstract class Role {
public Role nextPlayer; // 下一個領了懸賞的玩家
protected String roleName;
public Role(String roleName){
this.roleName = roleName;
}
/**
* 得到玩家角色的戰斗力
* @return 戰斗力
*/
public abstract int getFightingCapacity();
/**
* 處理請求或者傳遞 -- 這里為領取懸賞任務,完成不了(戰斗力不夠)就下個領了懸賞的玩家完成(傳遞)
* @param bossFightingCapacity,懸賞榜的BOSS的戰斗力
*/
public final void handleRequest(int bossFightingCapacity){
if(bossFightingCapacity<=getFightingCapacity()){
// BOSS戰斗力不高于玩家,玩家就可以殺死BOSS
killBOSS();
}else{
// BOSS太厲害了,由高手解決吧,自己淚閃了
if(nextPlayer!=null){
// 讓下個玩家領取懸賞
nextPlayer.handleRequest(bossFightingCapacity);
}else{
// 沒人領懸賞
System.out.println("這個BOSS為無敵BOSS,屌炸天!");
}
}
}
/**
* 具體的處理方法 -- 這里為每個玩家怎么殺死BOSS的
*/
public abstract void killBOSS();
}
~~~
?說明:每個具體的角色為一個玩家。
騎士小明
~~~
/**
* 騎士小明
* @author lt
*
*/
public class XiaoMing extends Role {
public XiaoMing(String roleName) {
super(roleName);
}
@Override
public int getFightingCapacity() {
return 2000;
}
@Override
public void killBOSS() {
System.out.println("我是"+roleName+",我的大刀早已饑渴難耐了!BOSS被大刀砍殺了");
}
}
~~~
法師小麗
~~~
/**
* 法師小麗
* @author lt
*
*/
public class XiaoLi extends Role {
public XiaoLi(String roleName) {
super(roleName);
}
@Override
public int getFightingCapacity() {
return 1000;
}
@Override
public void killBOSS() {
System.out.println("我是"+roleName+",我的新魔杖,代表月亮消滅了BOSS!");
}
}
~~~
獵手小華
~~~
/**
* 獵手小華
* @author lt
*
*/
public class XiaoHua extends Role{
public XiaoHua(String roleName) {
super(roleName);
}
@Override
public int getFightingCapacity() {
return 3000;
}
@Override
public void killBOSS() {
System.out.println("我是"+roleName+",我的弓箭早已暗藏不住了!BOSS被射殺了");
}
}
~~~
測試:
懸賞一個2900戰力的BOSS
~~~
public class Test {
public static void main(String[] args) {
Role xm = new XiaoMing("血魂騎士");
Role xh = new XiaoHua("狙魔獵手");
Role xl = new XiaoLi("秘法游俠");
xl.nextPlayer = xm;
// 通常高手都是最后一個出現的
xm.nextPlayer = xh;
// 今有一個2900戰斗力的BOSS,需要能人義士來消滅
Reward reward = new Reward();
reward.bossFightingCapacity = 2900;
// 小麗太激動了,第一個領了懸賞任務
xl.handleRequest(reward.bossFightingCapacity);
}
}
~~~
結果:

懸賞一個1900戰力的BOSS

懸賞一個900戰力的BOSS

總結:
通過上面的BOSS懸賞測試,我們看到了當領取了懸賞任務的所有玩家中,當最先領取的玩家完成不了時會交給下面的玩家來完成否則自己來完成,直到有玩家可以殺死BOSS。這些領取了懸賞的所有玩家都在一條責任鏈中(殺死BOSS),使得他們都有機會去殺死BOSS,這就是責任鏈模式的簡單實現。當然,責任鏈中的處理順序也不是固定的,可以改變,如小麗完成不了可以直接交給小華,而不用先交給小明。
責任鏈模式是為了處理某種請求而生的,當我們有這樣的請求的時候可以考慮使用該模式,具體可以參考使用場景。好吧,該預習了,不能掛科了。