它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的使用者。
封裝了變化
策略模式的strategy類層次為context定義了一系列可供重用的演算法或行為。繼承有助於析取出這些演算法中的公共功能
簡化了單元測試,每個演算法都有自己的類,,可以通過自己的介面單獨測試
減少了演算法類和使用演算法類之間的耦合,乙個演算法乙個類
在基本的策略模式中,所具有具體實現的職責由客戶端物件承擔,並轉給策略模式的context物件。
多個類只區別在表現行為不同,可以使用strategy模式,在執行時動態選擇具體要執行的行為。
策略模式
strategy類,定義所有支援的演算法的公共介面
//抽象演算法類
abstract
class
strategy
concretestrategy類:封裝了具體的演算法或行為,繼承於strategy
//具體演算法a
class
concretestrategya
:strategy
}//具體演算法b
class
concretestrategyb
:strategy
}//具體演算法c
class
concretestrategyc
:strategy
}
context類:用乙個concretestrategy來配置,維護乙個對strategy物件的引用。
class
context
//上下文介面
public
void
contextinte***ce()
}
客戶端**
static
void
main
(string
args)
//由於例項化不同的策略,所以最終在呼叫context.contextinte***ce();時所獲得的結果就不相同
//宣告context 型別變數
context context;
context=
newcontext
(new
concretestrategya()
);context.
contextinte***ce()
; context=
newcontext
(new
concretestrategyb()
);context.
contextinte***ce()
; context=
newcontext
(new
concretestrategya()
);context.
contextinte***ce()
; console.
read()
;
類圖關係**表示
對類進行初始化,
與類同名
無返回值,無void
與類同名,在new的時候使用
所有類都有構造方法,如果不編碼則系統預設生成空的構造方法,若你有定義的構造方法那麼預設的構造方法就會失效。
public:公有的 表示所修飾的類成員可以允許其他任何類來訪問
private:私有的 表示只能在同乙個類的成員訪問
本模式中涉及到的關係
聚合:表示一種弱的擁有關係,整體和個體的關係,個體可以脫離整體單獨存在
實現:成員變數,作為引數傳入到整體的構造方法
圖形:空心菱形+實線箭頭
繼承:類與類,類與介面之間的關係,。子類繼承父類所有非private的方法
實現:子類繼承父類用:表示
圖形:空心三角形+實線
用abstract關鍵字修飾
抽象類代表乙個抽象的概念,他提供乙個繼承的出發點,當設計乙個新的抽象類時,一定是用來繼承的,在乙個以繼承關係形成的等級結構裡面,樹葉節點應當是具體類,而樹葉節點均應是抽象類。
抽象類不能例項化
抽象方法時必須被子類重寫的
如果類中包含抽象方法,那麼類必須定義為抽象類,不論是否還包含其他一般方法
乙個類可以支援多個介面,乙個類只能繼承乙個類。
設計模式 策略設計模式
策略設計模式其實就是多型的使用,父類引用指向子類物件。策略模式的最大特點是使得演算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成乙個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。案列 author de...
設計模式 策略模式
策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些方法完成的都是相同的工作,只是實現不同,他們可以用相同的方式呼叫所有的演算法,減少了演算法類和使用演算法類之間的耦合.優點 策略模式的strategy類層次為context定義了一系列可供重用的演算法和行為,繼承有助於吸取這些演算法中的公共...
設計模式 策略模式
定義了演算法家族,分別封裝起來,讓他們之間可以相互替代,此模式讓演算法的變化,不會影響到使用演算法的客戶端 定義抽象類 分別實現抽象類,不同的物件 然後用乙個類初始化,並傳入具體的策略物件 根據具體的策略物件,呼叫其演算法的方法 客戶端 是由於例項化不同的策略,所以最終在呼叫 類時,所獲得的結果時不...