[C++設計模式] strategy 策略模式

按照陳碩老師的觀點,c++裏有面向過程編程,面向對象編程,基於對象編程(面向接口編程)和泛型編程,四種思路都各有其適用場景。

面向過程編程是沿襲C的結構化編程思路,OOP是C++的核心,也是現代高級編程語言的核心。

c++的OO核心是繼承和多態,在GUI編程,構建關鍵類等編程中很有用,但是泛用繼承和多態,會增加複用和維護的難度,也會使軟件臃腫複雜。

基於對象編程(面向接口編程),多采用組合,類之間鬆耦合,可以簡化類別架構,方便複用和維護。

使用function/bind也可以實現接口與實現的分離,既可以調用類的成員函數,又可以調用普通的全局函數。

c++11和boost中都有實現, 

boost庫 bind/function的使用 


策略模式是指將不易改變的算法和變化的算法分別封裝起來,讓變化的算法獨立於使用算法的客戶。

也就是說,在設計基類的時候,將變化的算法單獨封裝成接口類,在該基類中組合調用。這樣使用該基類的客戶就可以調用接口類的接口實現不同的算法。


Context(應用場景):
1、需要使用ConcreteStrategy提供的算法。
2、 內部維護一個Strategy的實例。
3、 負責動態設置運行時Strategy具體的實現算法。
4、負責跟Strategy之間的交互和數據傳遞。
Strategy(抽象策略類):
1、 定義了一個公共接口,各種不同的算法以不同的方式實現這個接口,Context使用這個接口調用不同的算法,一般使用接口或抽象類實現。
ConcreteStrategy(具體策略類):
2、 實現了Strategy定義的接口,提供具體的算法實現。

應用場景:
1、 多個類只區別在表現行爲不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行爲。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。
3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。

優點:
1、 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承可以把公共的代碼轉移到父類裏面,從而避免重複的代碼。
2、 策略模式提供了可以替換繼承關係的辦法。繼承可以處理多種算法或行爲。如果不是用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行爲。但是,這樣一來算法或行爲的使用者就和算法或行爲本身混在一起。決定使用哪一種算法或採取哪一種行爲的邏輯就和算法或行爲的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態改變算法或行爲變得不可能。
3、 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把採取哪一種算法或採取哪一種行爲的邏輯與算法或行爲的邏輯混合在一起,統統列在一個多重轉移語句裏面,比使用繼承的辦法還要原始和落後。
缺點:
1、客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道所有的算法或行爲的情況。
2、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。有時候可以通過把依賴於環境的狀態保存到客戶端裏面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章