策略模式(Strategy Pattern)
阿新 • • 發佈:2019-01-01
是什麼?
怎麼用?
在什麼情況下用?
例子!
策略模式:
物件有某個行為,但在不同的場景下,改行為有不同的實現演算法。
比如:
每個人都要交「個人所得稅」,但「在美國交的個人所得稅」和「在中國交的個人所得稅」有不同的演算法。
再比如:
鴨子(所有的鴨子)有翅膀,但木頭做的鴨子不會飛,活的鴨子會飛,機械鴨子用動力飛。
使用場景:
1、一個系統有很多類,但這些類的區別僅是它們的行為不同。
2、一個系統需要在幾個演算法中動態的選擇一種。那麼這些演算法可以包裝到一個個具體的演算法類中,而這一個個具體的演算法類都是一個抽象演算法類的子類。
原理:
1、定義一族演算法(業務規則,如:鳥的飛行方式、個人所得稅的繳稅方式)
2、封裝每個演算法。
3、這些演算法之間可以相互替換。
例子:
比如:
設計一個鴨子游戲,遊戲中會出現各種鴨子,鴨子型別有木頭鴨(不會飛,不會叫)、模型鴨(不會叫,動力飛)、綠頭鴨(會飛、會叫)。
Duck 類相當於Context,是鴨子的基類,所有的鴨子都繼承這個類。
RubberDuck、ModeDuck 橡皮鴨和模型鴨,是具體的鴨子類。
FlyBehavior 是飛行的行為,是個介面,所有的飛行行為都繼承這個介面。所有的飛行行為組成了一組演算法。
FlyWithWings、FlyWithRocket 是具體的飛行類,每個類中實現了一種飛行方式,所有的具體類實現了介面的fly()方法。
QuackBehavior 是鳴叫的行為,是個介面,同飛行類一樣。所有的鳴叫方式都實現這個介面。
Quack、Squeak 是具體的鳴叫方式。