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