從Java多型到策略模式
阿新 • • 發佈:2018-12-30
先來複習下java多型:java多型指的是父類引用指向子類物件,不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。
接下來我們再說下什麼叫策略模式:將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。
可能說了這麼多你還沒明白什麼事策略模式,接下我們來舉個例子
玩過LOL的同學都知道,LOL有上百個英雄,如果用OO技術來設計這些英雄該怎麼辦?
小肖:簡單,先來個父類(Superclass),然後讓所有的英雄繼承此父類,不同的方法重寫父類方法即可。
每個英雄的QWER技能都是不一樣的,重寫可以沒問題,但是召喚師技能DF每個英雄都是固定的幾個難不成也都要子類重寫?
小肖:對哦,召喚師技能如果都讓子類重寫那麼就會產生多個子類程式碼重複,怎麼辦呢?
設計原則:找出應用可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。
小肖:變化之處那就是召喚師技能,可以把召喚師技能抽取出來寫成一個介面,所有召喚師技能都需要實現這個介面。
設計原則:針對介面程式設計,而不是針對實現程式設計。
小肖:這樣可以把所有固定的召喚師技能先寫好,等玩家選擇召喚師技能只需要設定具體的召喚師技能即可。就算以後有新的召喚師技能只需要實現這個介面就好了,具體實現類可以互相的替換。
改進之後父類英雄實現召喚師技能就好了:
設計原則:多用組合,少用繼承。
現在應該思路比較清晰了吧,我們開始擼蓋倫了
召喚師技能介面
ublic interface 召喚師技能 {
public void 技能();
}
具體實現
public class 治療術 implements 召喚師技能 {
public void 技能(){
//為你的英雄和附近的友軍回覆生命值。
};
}
英雄類
public class 英雄 {
public void 設定召喚師技能(召喚師技能 技能變數){
技能變數.技能();
}
}
客戶端呼叫
public class 客戶端 {
public static void main(String[] args) {
//選擇並建立需要使用的策略物件
召喚師技能 我的治療術 = new 治療術();
//建立環境
英雄 我大蓋倫 = new 蓋倫();
//使用策略
我大蓋倫.設定召喚師技能(我的治療術);
}
}
首先定義了演算法(召喚師技能介面),分別封裝起來(具體的實現類:傳送、治療術,清晰術等),讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶,這就是所謂的策略模式。