LOL設計模式之「策略模式」
阿新 • • 發佈:2019-01-09
之前寫過一篇什麼是「設計模式」?,沒有類圖,沒有程式碼,有些同學說看不太懂,今天給大家帶來策略模式(有圖,有碼,有真相!)。
英雄聯盟(LOL)
玩過LOL的同學都知道,LOL有上百個英雄,如果用OO技術來設計這些英雄該怎麼辦?
小明:簡單,先來個父類(Superclass),然後讓所有的英雄繼承此父類,不同的方法重寫父類方法即可。
每個英雄的QWER技能都是不一樣的,重寫可以沒問題,但是召喚師技能每個英雄都是固定的幾個難不成也都要子類重寫?
小明:對哦,召喚師技能如果都讓子類重寫那麼就會產生多個子類程式碼重複,怎麼辦呢?
設計原則:找出應用可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。
小明:變化之處那就是召喚師技能,可以把召喚師技能抽取出來寫成一個介面,所有召喚師技能都需要實現這個介面。
設計原則:針對介面程式設計,而不是針對實現程式設計。
小明:這樣可以把所有固定的召喚師技能先寫好,等玩家選擇召喚師技能只需要設定具體的召喚師技能即可。就算以後有新的召喚師技能只需要實現這個介面就好了,具體實現類可以互相的替換。
設計原則:多用組合,少用繼承。
小明:思路理清楚了,那就直接上程式碼。
召喚師技能介面
public interface 召喚師技能 {
public void 技能();
}
具體實現
public class 治療術 implements 召喚師技能 {
public void 技能(){
//為你的英雄和附近的友軍回覆生命值。
};
}
英雄類
public class 英雄 {
public void 召喚師技能(召喚師技能 技能){
技能變數.技能();
}
}
客戶端
public class 客戶端 {
public static void main(String[] args) {
//選擇並建立需要使用的策略物件
召喚師技能 我的治療術 = new 治療術();
//建立環境
英雄 我的蓋倫 = new 蓋倫();
//使用策略
我的蓋倫.召喚師技能(我的治療術);
}
}
這就是所謂的「策略模式」了,定義了演算法(召喚師技能介面),分別封裝起來(具體的實現類:傳送、治療術),讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。
以上程式碼塊用中文編寫類名、變數名是為了讓大家更好的理解,在實戰過程中記得替換成相對應的英文。