之前寫過一篇什么是「設計模式」铣口?隙轻,沒有類圖胜茧,沒有代碼室叉,有些同學說看不太懂抑片,今天給大家?guī)聿呗阅J剑ㄓ袌D卵佛,有碼,有真相!)截汪。
英雄聯(lián)盟(LOL)
玩過LOL的同學都知道疾牲,LOL有上百個英雄,如果用OO技術(shù)來設計這些英雄該怎么辦衙解?
小明:簡單阳柔,先來個父類(Superclass),然后讓所有的英雄繼承此父類蚓峦,不同的方法重寫父類方法即可舌剂。
每個英雄的QWER技能都是不一樣的,重寫可以沒問題暑椰,但是召喚師技能每個英雄都是固定的幾個難不成也都要子類重寫霍转?
小明:對哦,召喚師技能如果都讓子類重寫那么就會產(chǎn)生多個子類代碼重復一汽,怎么辦呢避消?
設計原則:找出應用可能需要變化之處,把它們獨立出來召夹,不要和那些不需要變化的代碼混在一起岩喷。
小明:變化之處那就是召喚師技能,可以把召喚師技能抽取出來寫成一個接口戳鹅,所有召喚師技能都需要實現(xiàn)這個接口均驶。
設計原則:針對接口編程,而不是針對實現(xiàn)編程枫虏。
小明:這樣可以把所有固定的召喚師技能先寫好妇穴,等玩家選擇召喚師技能只需要設置具體的召喚師技能即可。就算以后有新的召喚師技能只需要實現(xiàn)這個接口就好了隶债,具體實現(xiàn)類可以互相的替換腾它。
設計原則:多用組合,少用繼承死讹。
小明:思路理清楚了瞒滴,那就直接上代碼。
召喚師技能接口
public interface 召喚師技能 {
public void 技能();
}
具體實現(xiàn)
public class 治療術(shù) implements 召喚師技能 {
public void 技能(){
//為你的英雄和附近的友軍回復生命值赞警。
};
}
英雄類
public class 英雄 {
public void 召喚師技能(召喚師技能 技能){
技能變量.技能();
}
}
客戶端
public class 客戶端 {
public static void main(String[] args) {
//選擇并創(chuàng)建需要使用的策略對象
召喚師技能 我的治療術(shù) = new 治療術(shù)();
//創(chuàng)建環(huán)境
英雄 我的蓋倫 = new 蓋倫();
//使用策略
我的蓋倫.召喚師技能(我的治療術(shù));
}
}
這就是所謂的「策略模式」了妓忍,定義了算法(召喚師技能接口),分別封裝起來(具體的實現(xiàn)類:傳送愧旦、治療術(shù))世剖,讓他們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶笤虫。
以上代碼塊用中文編寫類名旁瘫、變量名是為了讓大家更好的理解祖凫,在實戰(zhàn)過程中記得替換成相對應的英文。
畫圖工具:
Giffy Diagrams
相關閱讀:
BRVAH之添加動畫(策略模式)
擴展閱讀:
如何實施代碼重構(gòu)酬凳?
參考書籍:
《Head First 設計模式》