C 設計模式(十七)責任鏈模式

2021-06-29 02:43:37 字數 1299 閱讀 7547

從生活中的例子可以發現,某個請求可能需要幾個人的審批,即使技術經理審批完了,還需要上一級的審批。這樣的例子,還有公司中的請假,少於3天的,直屬leader就可以批准,3天到7天之內就需要專案經理批准,多餘7天的就需要技術總監的批准了。介紹了這麼多生活中責任鏈模式的例子的,下面具體給出物件導向中責任鏈模式的定義。

責任鏈模式指的是——某個請求需要多個物件進行處理,從而避免請求的傳送者和接收之間的耦合關係。將這些物件連成一條鍊子,並沿著這條鍊子傳遞該請求,直到有物件處理它為止。

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

主要涉及兩個角色:

有了上面的介紹,下面以公司採購東西為例子來實現責任鏈模式。公司規定,採購架構總價在1萬之內,經理級別的人批准即可,總價大於1萬小於2萬5的則還需要副總進行批准,總價大於2萬5小於10萬的需要還需要總經理批准,而大於總價大於10萬的則需要組織乙個會議進行討論。對於這樣乙個需求,最直觀的方法就是設計乙個方法,引數是採購的總價,然後在這個方法內對**進行調整判斷,然後針對不同的條件交給不同級別的人去處理,這樣確實可以解決問題,但這樣一來,我們就需要多重if-else語句來進行判斷,但當加入乙個新的條件範圍時,我們又不得不去修改原來設計的方法來再新增乙個條件判斷,這樣的設計顯然違背了「開-閉」原則。這時候,可以採用責任鏈模式來解決這樣的問題。具體實現**如下所示。

class program

public class purchaserequest

public string productname

public purchaserequest(double amount,string productname)

}public abstract void processrequest(purchaserequest request);

}public override void processrequest(purchaserequest request)

else }}

}public override void processrequest(purchaserequest request)

else}}

}

在以下場景中可以考慮使用責任鏈模式:

責任鏈模式的優點不言而喻,主要有以下點:

責任鏈模式也具有一定的缺點,如:

十七 責任鏈模式

責任鏈模式 使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成 一條鏈,並沿著這條鏈傳遞該請求,直到乙個物件處理它為止。摘自 大話設計模式 ps 責任處理類都有各自的負責區塊,以聚合的方式連成整個的責任鏈條。基本結構如下 request 請求 handler 處理...

C 設計模式 責任鏈模式

優點 請求和處理分開 缺點 避免出現超長鏈的情況,一般的做法是在handler中設定乙個最大節點數量,在setnext方法中判斷是否已經是超過其閾值,超過則不允許該鏈建立,避免無意識地破壞系統效能 抽象處理者 ifndef handler h define handler h include req...

設計模式 責任鏈模式

定義 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些請求連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。例項 請假加薪審批 using system using system.collections.generic using system.text namespa...