什麼是責任鏈模式
所謂責任鏈模式,就是使多個對象都有機會處理請求,並講這些對象連成一條鏈,沿着這條鏈傳遞請求直到有對象處理請求爲止的設計模式。責任鏈模式可以避免請求的發送者和接收者之間的耦合關係。
責任鏈模式的實現方式
熟悉我的人都知道我對華容道遊戲情有獨鍾,2014年用AndEngine實現了一個華容道交了畢業設計,2015年用OGEngine參賽中了一部手機……我每年都要用不同的新技術實現一遍華容道。華容道的背景故事請見《三國演義》第五十回。
這次我拿華容道給大家講解一遍責任鏈模式,首先定義一個抽象的將軍類:
public abstract class General {
protected General nextGeneral;
/** * 姓名 */ public abstract String getName();
/** * 武力 */ public abstract int getForce();
/** * 攔截曹操 * @param force 曹操手下將軍能拿出來的最高武力 */ public final void tryCaoCao(int force){ if (force <= getForce()){ catchCaoCao(); }else{ if (nextGeneral != null){ nextGeneral.tryCaoCao(force); } } }
/** * 有能力抓獲曹操 */ public void catchCaoCao(){ Log.e("曹操無路可逃","曹操兵敗走華容,正與" + getName() + "狹路逢。只爲當初恩義重,放開金鎖走蛟龍。"); }
} |
趙雲:
public class ZhaoYun extends General { @Override public String getName() { return "趙雲"; }
@Override public int getForce() { return 95; } } |
張飛:
public class ZhangFei extends General { @Override public String getName() { return "張飛"; }
@Override public int getForce() { return 97; } } |
關羽:
public class GuanYu extends General { @Override public String getName() { return "關羽"; }
@Override public int getForce() { return 100; } } |
曹操走華容道:
ZhaoYun zhaoYun = new ZhaoYun(); ZhangFei zhangFei = new ZhangFei(); GuanYu guanYu = new GuanYu();
zhaoYun.nextGeneral = zhangFei; zhangFei.nextGeneral = guanYu;
zhaoYun.tryCaoCao(99); |
你可以試試,輸出結果和《三國演義》的劇情是否一致。
Android源碼中的責任鏈模式
(1)如果你讀完上文的代碼之後,沒有想到ViewGroup事件的分發處理機制,那麼你不適合學習設計模式,還是先補充補充基礎知識吧。
Android開發中如何利用責任鏈模式
(1)責任鏈模式可以對請求者和處理者關係解耦,提高代碼的靈活性。Broadcast可以分爲異步的Normal Broadcast和根據優先級依次傳播的Ordered Broadcast(有序廣播)兩種,有序廣播根據優先級依次傳播,直到有接收者將其終止或所有接收者都不中止它,這是典型的責任鏈模式。
需要注意的幾個問題
(1)責任鏈模式的最大缺點在於其對鏈中請求處理者的遍歷,如果處理者層級太多,尤其是在遞歸調用中,責任鏈模式非常影響性能。