Strategy Pattern(策略模式)

Head First定義:算法

策略模式定義了算法族,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。編程

 

策略模式的設計原則主要有三個:函數

  1. 找出應用中可能須要變化的部分,把它們獨立起來。
  2. 針對接口編程,而不是針對實現編程。
  3. 多用組合,少用繼承。

 

舉個例子.net

如今須要設計一個鴨子類(Duck),有不少不一樣的鴨子(紅頭鴨、綠皮鴨、橡皮鴨、木頭鴨...),因此Duck爲這些鴨子的父類。設計

要求以下:每種鴨子都有本身的外形特徵;鴨子都有游泳的行爲;有些鴨子可能會飛(玩具鴨就不會飛);有些鴨子可能會叫(木頭鴨就不會叫);不一樣種類的鴨子可能叫的不同。orm

(1)首先咱們將鴨子共有的特徵行爲抽象成方法:swim(游泳)和display(外形)blog

swim是不會變的,用具體的方法實現。而每中鴨子的外形不同,因此display能夠設計爲抽象方法,由具體的子類來實現。繼承

(2)將須要變化的部分獨立出來(原則1):fly(飛行)和quack(叫)接口

fly抽象成接口FlyBehavior,該接口有兩個具體的實現類,一個實現鴨子的飛行,另外一個實現不會飛。(這裏也就是策略模式定義所說的算法族)圖片

quack抽象成接口QuackBehavior,該接口有三個具體的實現類,分別實現真實鴨子的瓜瓜叫、橡皮鴨子的吱吱叫、木頭鴨子的不會叫。(同理,這也是個算法族)

而後將FlyBehavior與QuackBehavior做爲Duck類的成員屬性(原則3)。並在Duck中分別提供訪問兩個接口的行爲的方法performFly和performQuack,因此Duck仍是有4個行爲方法。

而兩個接口類型屬性的實例化,能夠有兩種方式注入,經過構造函數,或者經過setter方法。(原則2)

最後能夠獲得Duck類的設計以下:

 

(圖片來自:https://blog.csdn.net/lisiyuannnn/article/details/52460185)

相關文章
相關標籤/搜索