大話設計模式之職責鏈模式總結 java實現

2021-08-27 11:00:54 字數 2979 閱讀 6265

注:示例來自《大話設計模式》

假如現有如下場景 員工向經理申**薪或請假 經理沒權利 然後向總監上報 總監也沒許可權 向總經理上報 我們用**來實現這個場景 簡單**實現如下

申請類

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 具體處理者類,處理它所負責的請求,可訪問它的後繼者,如果可處理該請求,則處理,否則轉給它...