設計模式之職責鏈模式

作者:吳小龍同學

原文鏈接:設計模式之職責鏈模式

職責鏈模式

職責鏈( Chain of Responsibility )模式也被叫做責任鏈模式,在《設計模式》屬於行為型模式,是一個請求有多個對象來處理,這些對象是一條鏈,但具體由哪個對象來處理,根據條件判斷來確定,如果不能處理會傳遞給該鏈中的下一個對象,直到有對象處理它為止。責任鏈模式將請求和處理分離開來,進行解耦。

責任鏈模式涉及角色

1、抽象處理者( Handler )角色:定義一個處理請求的抽象類。如果需要,可以定義一個方法以設定和返回對下家的引用。

2、具體處理者( ConcreteHandler ) 角色:具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。

應用場景

很常見的一個場景:請假。假定請假3天以內,由項目經理直接審批;3-5天,由部門經理審批通過;大於5天,則由總經理通過。

如果把上面的場景應用到責任鏈模式中去,項目經理、部門經理、總經理就是一個個具體的責任人,他們可以對請求做出處理,但是他們也只能在自己的許可權範圍內處理該請求。

抽象處理者

/**n * 抽象處理者n */npublic static abstract class Handler {n private Handler nextHandler;n // 當前領導能審批通過的最多天數n public int maxDay;n protected Handler(int maxDay) {n this.maxDay = maxDay;n }n //設置責任鏈中下一個處理請求的對象n public void setNextHandler(Handler handler) {n nextHandler = handler;n }n protected void handleRequest(int day) {n if (day <= maxDay) {n reply(day);n } else {n if (nextHandler != null) {n //審批許可權不夠,繼續上報n nextHandler.handleRequest(day);n } else {n LogUtil.d("沒有更高的領導審批了");n }n }n }n protected abstract void reply(int day);n}n

具體處理者

項目經理

/**n * 項目經理n */nclass ProjectManager extends Handler {n public ProjectManager(int day) {n super(day);n }n @Overriden protected void reply(int day) {n LogUtil.d(day + "天請假,項目經理直接審批通過");n }n}n

部門經理

/**n * 部門經理n */nclass DepartmentManager extends Handler {n public DepartmentManager(int day) {n super(day);n }n @Overriden protected void reply(int day) {n LogUtil.d(day + "天請假,部門經理審批通過");n }n}n

總經理

/**n * 總經理n */nclass GeneralManager extends Handler {n public GeneralManager(int day) {n super(day);n }n @Overriden protected void reply(int day) {n LogUtil.d(day + "天請假,總經理審批通過");n }n}n

代碼調用

Handler projectManager = new ProjectManager(3);nHandler departmentManager = new DepartmentManager(5);nHandler generalManager = new GeneralManager(15);n//創建職責鏈nprojectManager.setNextHandler(departmentManager);ndepartmentManager.setNextHandler(generalManager);n//發起一次請求nprojectManager.handleRequest(10);n

列印

04-18 15:18:08.726 19678-19678/com.wuxiaolong.androidsamples D/wxl: 10天請假,總經理審批通過n

Android 應用

1、Ordered Broadcast (有序廣播)

Ordered Broadcast 的接收者將按預先聲明的優先順序依次接收 Broadcast 。如:A 的級別高於 B , B 的級別高於 C 。那麼,Broadcast 先傳給 A ,再傳給 B ,最後傳給 C 。優先順序聲明在元素的 Android:priority 屬性中,數越大優先順序別越高,取值範圍為 -1000~1000 。

2、ViewGroup 事件傳遞

事件傳遞也類似於一條責任鏈,分別有 dispatchTouchEvent (分發)、 onInterceptTouchEvent (攔截)、 onTouchEvent (處理),尋找責任者,一旦責任者消費掉該次事件,就並不再傳遞,體現在 View 的 onTouchEvent 方法中返回值。

參考

《JAVA與模式》之責任鏈模式

Android設計模式源碼解析之責任鏈模式

JAVA設計模式之 職責鏈模式【Chain of Responsibility Pattern】

閱讀原文

推薦閱讀:

設計模式之策略模式
Lua的好處是什麼以及如何用Lua設計所謂「組件式架構」?
設計模式之七大基本原則
設計模式之單例模式
抽象工廠模式和工廠模式的區別?

TAG:设计模式 | 场景应用 | 代码 |