1. 程式人生 > >從Java多型到策略模式

從Java多型到策略模式

先來複習下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 蓋倫(); //使用策略 我大蓋倫.設定召喚師技能(我的治療術); } }

首先定義了演算法(召喚師技能介面),分別封裝起來(具體的實現類:傳送、治療術,清晰術等),讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶,這就是所謂的策略模式。