Head First設計模式之責任鏈模式

2021-09-07 14:42:43 字數 1959 閱讀 7455

避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。

主要解決:職責鏈上的處理者負責處理請求,客戶只需要將請求傳送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的傳送者和請求的處理者解耦了。

何時使用:在處理訊息的時候以過濾很多道。

如何解決:攔截的類都實現統一介面。

從責任鏈模式的定義可以發現,責任鏈模式涉及的物件只有處理者角色,但由於有多個處理者,它們具有共同的處理請求的方法,所以這裡抽象出乙個抽象處理者角色進行**復用。這樣分析下來,責任鏈模式的結構圖也就不言而喻了,具體結構圖如下所示。

主要涉及兩個角色:

1、有多個物件可以處理同乙個請求,具體哪個物件處理該請求由執行時刻自動確定。

2、在不明確指定接收者的情況下,向多個物件中的乙個提交乙個請求。

3、可動態指定一組物件處理請求。

優點:

缺點:

以公司採購東西為例來實現責任鏈模式。公司規定,採購架構總價在1萬之內,經理級別的人批准即可,總價大於1萬小於2萬5的則還需要副總進行批准,總價大於2萬5小於10萬的需要還需要總經理批准,而大於總價大於10萬的則需要組織乙個會議進行討論。  

//

採購請求

public

class

purchaserequest

//產品名字

public

string productname

public purchaserequest(double amount, string

productname)

}//審批人,handler

public

abstract

class

public

string name

name)

public

abstract

void

processrequest(purchaserequest request);

}//concretehandler

public

class

public

override

void

processrequest(purchaserequest request)

批准購買

", name, request.productname);

}else

) }}

//concretehandler,副總

public

class

public

override

void

processrequest(purchaserequest request)

批准購買

", name, request.productname);

}else

) }}

//concretehandler,總經理

public

class

public

override

void

processrequest(purchaserequest request)

批准購買

", name, request.productname);

}else}}

class

program

}

結果

經理 批准購買 手機

副總 批准購買 空調

總經理 批准購買 膝上型電腦

參考:

歡迎閱讀本系列文章:head first設計模式之目錄

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...

《Head First設計模式》之命令模式

命令模式就是將方法呼叫 method invocation 封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景 記錄日誌或者重複使用這些封裝來實現撤銷 undo 我對...

Head First設計模式之組合模式

將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方法處理個別物件以及組合物件。主要部分可以被一致對待問題.組合模式主要包含三個角色 2.composite 容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定...