是什麼?算法
怎麼用?spa
在什麼狀況下用?設計
例子!對象
策略模式:blog
對象有某個行爲,但在不一樣的場景下,改行爲有不一樣的實現算法。繼承
好比:接口
每一個人都要交「我的所得稅」,但「在美國交的我的所得稅」和「在中國交的我的所得稅」有不一樣的算法。遊戲
再好比:it
鴨子(全部的鴨子)有翅膀,但木頭作的鴨子不會飛,活的鴨子會飛,機械鴨子用動力飛。io
使用場景:
一、一個系統有不少類,但這些類的區別僅是它們的行爲不一樣。
二、一個系統須要在幾個算法中動態的選擇一種。那麼這些算法能夠包裝到一個個具體的算法類中,而這一個個具體的算法類都是一個抽象算法類的子類。
原理:
一、定義一族算法(業務規則,如:鳥的飛行方式、我的所得稅的繳稅方式)
二、封裝每一個算法。
三、這些算法之間能夠相互替換。
例子:
好比:
設計一個鴨子游戲,遊戲中會出現各類鴨子,鴨子類型有木頭鴨(不會飛,不會叫)、模型鴨(不會叫,動力飛)、綠頭鴨(會飛、會叫)。
Duck 類至關於Context,是鴨子的基類,全部的鴨子都繼承這個類。
RubberDuck、ModeDuck 橡皮鴨和模型鴨,是具體的鴨子類。
FlyBehavior 是飛行的行爲,是個接口,全部的飛行行爲都繼承這個接口。全部的飛行行爲組成了一組算法。
FlyWithWings、FlyWithRocket 是具體的飛行類,每一個類中實現了一種飛行方式,全部的具體類實現了接口的fly()方法。
QuackBehavior 是鳴叫的行爲,是個接口,同飛行類同樣。全部的鳴叫方式都實現這個接口。
Quack、Squeak 是具體的鳴叫方式。