以前寫過一篇什麼是「設計模式」?,沒有類圖,沒有代碼,有些同窗說看不太懂,今天給你們帶來策略模式(有圖,有碼,有真相!)。java
英雄聯盟(LOL)
玩過LOL的同窗都知道,LOL有上百個英雄,若是用OO技術來設計這些英雄該怎麼辦?
小明:簡單,先來個父類(Superclass),而後讓全部的英雄繼承此父類,不一樣的方法重寫父類方法便可。 每一個英雄的QWER技能都是不同的,重寫能夠沒問題,可是召喚師技能每一個英雄都是固定的幾個難不成也都要子類重寫?
小明:對哦,召喚師技能若是都讓子類重寫那麼就會產生多個子類代碼重複,怎麼辦呢?git
設計原則:找出應用可能須要變化之處,把它們獨立出來,不要和那些不須要變化的代碼混在一塊兒。github
小明:變化之處那就是召喚師技能,能夠把召喚師技能抽取出來寫成一個接口,全部召喚師技能都須要實現這個接口。 算法
設計原則:針對接口編程,而不是針對實現編程。編程
小明:這樣能夠把全部固定的召喚師技能先寫好,等玩家選擇召喚師技能只須要設置具體的召喚師技能便可。就算之後有新的召喚師技能只須要實現這個接口就行了,具體實現類能夠互相的替換。 設計模式
設計原則:多用組合,少用繼承。工具
小明:思路理清楚了,那就直接上代碼。動畫
public interface 召喚師技能 {
public void 技能();
}複製代碼
public class 治療術 implements 召喚師技能 {
public void 技能(){
//爲你的英雄和附近的友軍回覆生命值。
};
}複製代碼
public class 英雄 {
public void 召喚師技能(召喚師技能 技能){
技能變量.技能();
}
}複製代碼
public class 客戶端 {
public static void main(String[] args) {
//選擇並建立須要使用的策略對象
召喚師技能 個人治療術 = new 治療術();
//建立環境
英雄 個人蓋倫 = new 蓋倫();
//使用策略
個人蓋倫.召喚師技能(個人治療術);
}
}複製代碼
這就是所謂的「策略模式」了,定義了算法(召喚師技能接口),分別封裝起來(具體的實現類:傳送、治療術),讓他們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。spa
以上代碼塊用中文編寫類名、變量名是爲了讓你們更好的理解,在實戰過程當中記得替換成相對應的英文。設計
畫圖工具: Giffy Diagrams
相關閱讀: BRVAH之添加動畫(策略模式)
擴展閱讀: 如何實施代碼重構?
參考書籍: 《Head First 設計模式》