1. 程式人生 > >LOL設計模式之「策略模式」

LOL設計模式之「策略模式」

之前寫過一篇什麼是「設計模式」?,沒有類圖,沒有程式碼,有些同學說看不太懂,今天給大家帶來策略模式(有圖,有碼,有真相!)。

英雄聯盟(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 蓋倫(); 
//使用策略
我的蓋倫.召喚師技能(我的治療術);
 }
}

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

以上程式碼塊用中文編寫類名、變數名是為了讓大家更好的理解,在實戰過程中記得替換成相對應的英文。