設計模式之職責鏈模式

2022-06-13 05:42:10 字數 2325 閱讀 8437

使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係,將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,知道有乙個物件處理它為止。

下面模擬以下場景:你想向公司領導(經理《總監《總經理)提出請假或者加薪。不過你提出某些請求經理或者總監無權批准,得向總經理上報,讓總經理定奪。

首先我們建立物件讓它提供這個請求服務。因此我們得建立乙個請求類。

class request 

public void setrequesttype(string requesttype)

public void setrequestcontent(string requestcontent)

public void setnumber(int number)

public string getrequesttype()

public string getrequestcontent()

public int getnumber()

}

接下來建立物件來提供對請求做出處理的服務。因此我們建立乙個管理者類。

class manger 

public void getresult(string managerlevel, request request)

}

最後建立乙個客戶端類,用於提交申請且回饋處理結果。

看看以上**會發現很多問題。

1.管理者類getresult()方法比較長,分支判斷太多。

2.想在管理者類中新增其他管理者(比如專案經理,部門經理什麼的)就意味著都需要去修改這個類,這個類承擔了太多責任違背了單一職責原則,增加新的管理者需要修改這個類違背了和開放-封閉原則。

從邏輯上講:我們想要請假是直接去找自己的上級————經理。當我們的上級處理不了了他就會去找他的上級。如此繼續直到請假這個請求得到結果。但上述**並沒有體現出這個過程。

那麼如何解決這個問題呢?我們看看職責鏈模式是如何做的。

/*

建立乙個抽象的管理這類,這個類的物件提供兩個服務:

1.處理自己能處理的請求。

2.將自己不能處理的請求傳遞給下一級管理者。

*/abstract class handler

//處理請求的抽象方法

public abstract void handlerequest(request request);

}

/*

建立各級別的管理者,他們都得實現handlerequest方法來處理請求。

*/class jingli extends handler

@override

public void handlerequest(request request)

}class zongjian extends handler

@override

public void handlerequest(request request)

}class zongjingli extends handler

@override

public void handlerequest(request request)

}

/*

請求類,此類的物件提供請求資訊的服務。

*/class request

public void setrequesttype(string requesttype)

public void setrequestcontent(string requestcontent)

public void setnumber(int number)

public string getrequesttype()

public string getrequestcontent()

public int getnumber()

}

/*

客戶端類:用於提交請求

*/public class client

}

將管理者類做成抽象的,方便我們增加不同的管理者類別(只需繼承這個抽象的管理者類,實現handlerequest()方法即可)。

將管理者關係鏈起來,當客戶提出乙個請求時,請求是沿鏈傳遞的,直到有乙個管理者能處理它。這樣做大大降低了耦合度。

設計模式之職責鏈模式

如果我們現在有乙個需求,乙個人他生了病,這個病要在 醫院才能看,但是這個病人並不清楚,就先去了一級醫院,一級醫院的醫生告訴他你的病要去二級醫院看,二級醫院也告訴他 你的病我這裡看不了,你要去 醫院才能看,最後他去 醫院把病看好了.這個過程直接寫成 class patient this.patient...

設計模式之職責鏈模式

職責鏈模式 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。適用場景 1 有多個的物件可以處理乙個請求,哪個物件處理該請求執行時刻自動確定 2 在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求 ...

設計模式之職責鏈模式

職責鏈模式 chain of responsibility 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將多個物件連成一條鏈,沿著這條鏈傳遞請求直到有物件處理它為止。可以定義乙個抽象類來表示處理事件的物件,這個類首先有個處理事件的抽象方法,然後提供乙個方法設定下一級處理者...