注:示例來自《大話設計模式》
假如現有如下場景 員工向經理申**薪或請假 經理沒權利 然後向總監上報 總監也沒許可權 向總經理上報 我們用**來實現這個場景 簡單**實現如下
申請類
package test24;
//申請
public
class request
public
void
setrequesttype(string requesttype)
public string getrequestcontent()
public
void
setrequestcontent(string requestcontent)
public
intgetnumber()
public
void
setnumber(int number)
}
管理者類
package test24;
//管理者
public
class manager
//得到結果
public
void
getresult(managerlevel managerlevel, request request)
else
}else
if (managerlevel == managerlevel.總監)
else
}else
if (managerlevel == managerlevel.總經理)
else
if (request.getrequesttype() == "加薪" && request.getnumber() <= 500)
else
if (request.getrequesttype() == "加薪" && request.getnumber() > 500)}}
}
管理者級別類
package test24;
public
enum managerlevel
客戶端**
package test24;
public
class program
}
上面的寫法 管理這類裡面的結果方法比較長 加上有太多的分支判斷 是非常不好的設計 違背了單一職責原則和開放-封閉原則 下面我們使用職責鏈模式進行重構 **如下
管理者類
package test24;
//管理者
public
abstract
class manager
//設定管理者的上級
public
void
setsuperior(manager superior)
//申請請求
abstract
public
void
}
經理類
package test24;
//經理
public
class
commonmanager
extends
manager
@override
public
void
if (request.getrequesttype() == "請假" && request.getnumber() <= 2)
else
}}
總監類
package test24;
//總監
public
class
majordomo
extends
manager
@override
public
void
if (request.getrequesttype() == "請假" && request.getnumber() <= 5)
else
}}
總經理類
package test24;
//總經理
public
class
generalmanager
extends
manager
@override
public
void
if (request.getrequesttype() == "請假")
else
if (request.getrequesttype() == "加薪" && request.getnumber() <= 500)
else
if (request.getrequesttype() == "加薪" && request.getnumber() > 500)
}}
客戶端**
package test24;
public
class program
}
這樣就很好地解決了原來大量的分支判斷造成的難維護 靈活性差的問題
職責鏈模式 使多個物件都有機會處理請求 從而避免請求的傳送者和接收者之間的耦合關係 將這個物件連成一條鏈 並沿著這條鏈傳遞該請求 直到有乙個物件處理它為止
職責鏈的好處 當客戶提交乙個請求時 請求是沿鏈傳遞直至有乙個concretehandler物件負責處理它
接收者和傳送者都沒有對方的明確資訊 且鏈中的物件自己也並不直到鏈的結構 結果是職責鏈可簡化物件的相互連線 它們僅需保持乙個指向其後繼者的引用 而不需保持它所有的候選接受者的引用
可以隨時地增加或修改處理乙個請求的結構 增強了給物件指派職責的靈活性
缺點 乙個請求極有可能到了鏈的末端都得不到處理 或者因為沒有正確配置而得不到處理
大話設計模式 職責鏈模式
1.當客戶提交乙個請求時,請求是沿鏈傳遞直至有乙個concretehandler物件負責處理它 dp 2.接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己也並不知道鏈的結構。結果是職責鏈可簡化物件的相互連線,它們僅需保持乙個指向其後繼者的引用,而不需保持它所有的候選接受者的引用 dp 3.隨時隨...
《大話設計模式 職責鏈模式》筆記
1 職責鏈模式 chain of responsibility 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。2 責任鏈模式結構圖 3 簡單 實現 handler類,定義乙個處理請示的介面。public a...
java 職責鏈模式(大話設計模式)
處理請求的介面 author administrator public abstract class handler public abstract void handlerequest int request 具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求,則處理,否則轉給它...