LOL設計模式之「策略模式」

以前寫過一篇什麼是「設計模式」?,沒有類圖,沒有代碼,有些同窗說看不太懂,今天給你們帶來策略模式(有圖,有碼,有真相!)。java

英雄聯盟(LOL)
玩過LOL的同窗都知道,LOL有上百個英雄,若是用OO技術來設計這些英雄該怎麼辦?
小明:簡單,先來個父類(Superclass),而後讓全部的英雄繼承此父類,不一樣的方法重寫父類方法便可。

每一個英雄的QWER技能都是不同的,重寫能夠沒問題,可是召喚師技能每一個英雄都是固定的幾個難不成也都要子類重寫?
小明:對哦,召喚師技能若是都讓子類重寫那麼就會產生多個子類代碼重複,怎麼辦呢?算法

設計原則:找出應用可能須要變化之處,把它們獨立出來,不要和那些不須要變化的代碼混在一塊兒。編程

小明:變化之處那就是召喚師技能,能夠把召喚師技能抽取出來寫成一個接口,全部召喚師技能都須要實現這個接口。設計模式

設計原則:針對接口編程,而不是針對實現編程。工具

小明:這樣能夠把全部固定的召喚師技能先寫好,等玩家選擇召喚師技能只須要設置具體的召喚師技能便可。就算之後有新的召喚師技能只須要實現這個接口就行了,具體實現類能夠互相的替換。動畫

設計原則:多用組合,少用繼承。spa

小明:思路理清楚了,那就直接上代碼。設計

召喚師技能接口

public interface 召喚師技能 { 

public void 技能();

}

具體實現

public class 治療術 implements 召喚師技能 {

public void 技能(){
  //爲你的英雄和附近的友軍回覆生命值。
};

}

英雄類

public class 英雄 {

   public void 召喚師技能(召喚師技能 技能){
      技能變量.技能();
   }
}

客戶端

public class 客戶端 { 
public static void main(String[] args) { 
//選擇並建立須要使用的策略對象 
召喚師技能 個人治療術 = new 治療術(); 
//建立環境 
英雄 個人蓋倫 = new 蓋倫(); 
//使用策略
個人蓋倫.召喚師技能(個人治療術);
 }
}

這就是所謂的「策略模式」了,定義了算法(召喚師技能接口),分別封裝起來(具體的實現類:傳送、治療術),讓他們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。code

以上代碼塊用中文編寫類名、變量名是爲了讓你們更好的理解,在實戰過程當中記得替換成相對應的英文。對象

畫圖工具:
Giffy Diagrams
相關閱讀:
BRVAH之添加動畫(策略模式)
擴展閱讀:
[如何實施代碼重構?](http://www.jianshu.com/p/dac7...
參考書籍:
《Head First 設計模式》

相關文章
相關標籤/搜索