天天看點

C#設計模式(20)——政策者模式(Stragety Pattern)一、引言二、政策者模式介紹三、政策者模式在.NET中應用四、政策者模式的适用場景五、政策者模式的優缺點六、總結

   前面主題介紹的狀态模式是對某個對象狀态的抽象,而本文要介紹的政策模式也就是對政策進行抽象,政策的意思就是方法,是以也就是對方法的抽象,下面具體分享下我對政策模式的了解。

  在現實生活中,政策模式的例子也非常常見,例如,中國的所得稅,分為企業所得稅、外商投資企業或外商企業所得稅和個人所得稅,針對于這3種所得稅,針對每種,所計算的方式不同,個人所得稅有個人所得稅的計算方式,而企業所得稅有其對應計算方式。如果不采用政策模式來實作這樣一個需求的話,可能我們會定義一個所得稅類,該類有一個屬性來辨別所得稅的類型,并且有一個計算稅收的CalculateTax()方法,在該方法體内需要對稅收類型進行判斷,通過if-else語句來針對不同的稅收類型來計算其所得稅。這樣的實作确實可以解決這個場景嗎,但是這樣的設計不利于擴充,如果系統後期需要增加一種所得稅時,此時不得不回去修改CalculateTax方法來多添加一個判斷語句,這樣明白違背了“開放——封閉”原則。此時,我們可以考慮使用政策模式來解決這個問題,既然稅收方法是這個場景中的變化部分,此時自然可以想到對稅收方法進行抽象。具體的實作代碼見2.3部分。

  前面介紹了政策模式用來解決的問題,下面具體給出政策的定義。政策模式是針對一組算法,将每個算法封裝到具有公共接口的獨立的類中,進而使它們可以互相替換。政策模式使得算法可以在不影響到用戶端的情況下發生變化。

  政策模式是對算法的包裝,是把使用算法的責任和算法本身分割開,委派給不同的對象負責。政策模式通常把一系列的算法包裝到一系列的政策類裡面。用一句話慨括政策模式就是——“将每個算法封裝到不同的政策類中,使得它們可以互換”。

  下面是政策模式的結構圖:

  

C#設計模式(20)——政策者模式(Stragety Pattern)一、引言二、政策者模式介紹三、政策者模式在.NET中應用四、政策者模式的适用場景五、政策者模式的優缺點六、總結

  該模式涉及到三個角色:

環境角色(Context):持有一個Strategy類的引用

抽象政策角色(Strategy):這是一個抽象角色,通常由一個接口或抽象類來實作。此角色給出所有具體政策類所需實作的接口。

具體政策角色(ConcreteStrategy):包裝了相關算法或行為。

  下面就以所得稅的例子來實作下政策模式,具體實作代碼如下所示:

   在下面的情況下可以考慮使用政策模式:

一個系統需要動态地在幾種算法中選擇一種的情況下。那麼這些算法可以包裝到一個個具體的算法類裡面,并為這些具體的算法類提供一個統一的接口。

如果一個對象有很多的行為,如果不使用合适的模式,這些行為就隻好使用多重的if-else語句來實作,此時,可以使用政策模式,把這些行為轉移到相應的具體政策類裡面,就可以避免使用難以維護的多重條件選擇語句,并展現面向對象涉及的概念。

   政策模式的主要優點有:

政策類之間可以自由切換。由于政策類都實作同一個接口,是以使它們之間可以自由切換。

易于擴充。增加一個新的政策隻需要添加一個具體的政策類即可,基本不需要改變原有的代碼。

避免使用多重條件選擇語句,充分展現面向對象設計思想。

  政策模式的主要缺點有:

政策模式會造成很多的政策類。

  到這裡,政策模式的介紹就結束了,政策模式主要是對方法的封裝,把一系列方法封裝到一系列的政策類中,進而使不同的政策類可以自由切換和避免在系統使用多重條件選擇語句來選擇針對不同情況來選擇不同的方法。在下一章将會大家介紹責任鍊模式。

繼續閱讀