最近學習到設計模式,現總結個人學習備責任鍊模式内容【注重的是每一個對象對其下個對象的引用】。
上一篇:Java設計模式-備忘錄模式
文章目錄
- 定義
- 優缺點
-
- 優點
- 缺點
- 實作
-
- 代碼
- 測試
定義
對象由每一個對象對其下家的引用而連接配接起來形成一條鍊,即責任鍊。職責鍊上的處理者負責處理請求,客戶隻需要将請求發送到職責鍊上即可,無須關心請求的處理細節和請求的傳遞,是以職責鍊将請求的發送者和請求的處理者解耦了。
優缺點
優點
- 簡化了對象。使得對象不需要知道鍊的結構。【鍊中的每一個節點不需要知道其他節點的内部形态】
- 增強給對象指派職責的靈活性。通過改變鍊内的成員或者調動它們的次序,允許動态地新增或者删除責任。
- 增加新的請求處理類很友善。【鍊條上添加節點,僅處理自己的邏輯即可】
缺點
- 不能保證請求一定被接收。【每一個節點負責行為,可能一個類的行為出錯整個鍊條崩潰】
- 系統性能将受到一定影響,而且在進行代碼調試時不太友善,可能會造成循環調用。
實作
代碼
角色:
- 鍊條節點抽象類:定義了抽象行為,以及定義了存放鍊的下一個節點的引用【類似指針指向下一個節點】。
- 具體節點:對抽象行為的實作。
/**鍊條節點的抽象類
* 鍊的關鍵記錄鍊的下一個人,以及執行鍊的行為
* @author cc百川
*/
public abstract class Chain {
Chain nextnode;//存儲下一個節點
String nodename;//節點名稱
public Chain( String nodename) {
this.nodename = nodename;
}
public Chain setNextNode(Chain nextnode) {
this.nextnode = nextnode;
return this;
}
public abstract void doChain(User user);
}
/** 鄉村遊醫 【假定級别】
* @author cc百川
*/
class VillageDoctor extends Chain{
public VillageDoctor(String appname) {super( appname);}
@Override
public void doChain(User user) {
if(user.grade <= 1) {
System.out.println(this.nodename+"鑒定【"+user.username+"】 體溫正常級别無需吃藥。");
} else if(user.grade >=2 && user.grade <5) {
System.out.println(this.nodename+"鑒定【"+user.username+"】 屬于普通發燒,吃一些處方藥即可。");
} else {
nextnode.doChain(user);
}
}
}
/** 名醫【假定高于遊醫】
* @author cc百川
*/
class FamousDoctor extends Chain{
public FamousDoctor(String appname) {super( appname);}
@Override
public void doChain(User user) {
if (user.grade >=5 && user.grade <8) {
System.out.println(this.nodename+"鑒定【"+user.username+"】 屬于普通流感,住院治療即可。");
} else {
nextnode.doChain(user);
}
}
}
/** 宮廷名醫【假定高于名醫】
* @author cc百川
*/
class CourtDoctor extends Chain{
public CourtDoctor( String appname) {super( appname); }
@Override
public void doChain(User user) {
if (user.grade >=8 && user.grade <=10) {
System.out.println(this.nodename+"鑒定【"+user.username+"】 屬于病毒性流感,需要隔離觀察。");
} else {
nextnode.doChain(user);
}
}
}
測試
public class Test {
public static void main(String[] args) {
CourtDoctor thosp = new CourtDoctor("宮廷禦醫雲中君");
FamousDoctor shosp = new FamousDoctor("端木蓉名醫");
VillageDoctor chosp = new VillageDoctor("道家遊醫逍遙子");
chosp.setNextNode(shosp);
shosp.setNextNode(thosp);
thosp.setNextNode(chosp);
chosp.doChain(new User("韓非", 2));
chosp.doChain(new User("鬼谷子", 7));
chosp.doChain(new User("雪女", 8));
}
}
責任鍊模式,重點在于每一個對象對其下個對象的引用,進而僅鍊式處理。
以上僅為個人學習,如果錯誤望指出,謝謝。