策略模式:定義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
先不管定義是如何,讓我們先來看一個例子。假設你要設計一個游戲里的人物(包括玩家、NPC),如何進行設計呢?我們知道,一個游戲人物肯定有基本屬性、動作(如血量的屬性、行走的動作),能夠拿不同的武器,能夠換不同的裝備......如何進行彈性的設計。在這里,我們就可以使用策略模式。
設計原則1:找出應用之中可能變化之處,把它們獨立出來,不要和那些不要變化的代碼混在一起。在這里,我們可以看到游戲人物可以拿不同的武器, 能夠換不同的裝備,屬于變化的部分,可以獨立出來;行走的動作等屬于不變的部分,可以不需獨立出來,可以先實現為一個類。

基本人物代碼:
public class GamePerson{ PRivate int bloodValue; public GamePerson(int value){ this.bloodValue=value; } public int getBloodValue(){ return bloodValue; } private void move(){ System.out.println("I'm moving"); }}
現在我們考慮的是如何實現裝備、武器等的實現,使其能夠具有彈性,在游戲時動態改變。所以,就需要設計原則2:針對接口編程,而不是針對實現編程。利用接口表示每個行為,比如EquipmentInterface,WeaponInterface.我們不用GamePerson實現這兩個接口,而是自己創建具體的裝備類、武器類實現各自的接口。如:ClothingEquipment,WristEquipment,SWordWeapton,GunWeapton.
具體代碼如下:
裝備接口:
public interface EquipmentInterface{ void equipment();}衣服裝備:
public class ClothingEquipment implement EquipmentInterface{ public void equipment(){ Systemout.out.println("I'm clothing"); } }手腕裝備
public class WristEquipment implement EquipmentInterface{ public void equipment(){ Systemout.out.println("I'm wrist"); } }武器接口
public interface WeaptonInterface{ void weapton(); }刀劍武器
public class SwordWeapton implement WeaptonInterface{ void weapton(){ System.out.println("I'm sword"); } }槍武器
public class GunWeapton implement WeaptonInterface{ void weapton(){ System.out.println("I'm gun"); } }好,最后我們就需要將這兩個組合在一起了。具體的說,需要在游戲人物中加入WeaptonInterface與EquipmentInterface。如下:
public class GamePerson{ private int bloodValue; WeaptonInterface weapton; EquipmentInterfac equipment; public void setWeapton(WeaptonInterface w){ this.weapton = w; } public void setEquipment(EquipmentInterface w){ this.equipment = w; } public GamePerson(int value,WeaptonInterface w,EquipmentInterface e){ this.bloodValue=value; this.weapton = w; this.equipment =e; } public int getBloodValue(){ return bloodValue; } private void move(){ System.out.println("I'm moving"); }} 所以,具體的人物類可以繼承GamePerson,如:
public class NPCPerson extends GamePerson{ public void NPCPerson(int b,WeaptonInterface w,EquipmentInterface e){ super(b,w,e); } }測試一下:
public class TestApp{ public static void main(String[] args){ NPCPerson p = new NPCPerson(100,new SwordWeapton(),new WristWeapton()); p.move(); p.setWeapton(new GunWeapton()); }}在最后需要記住設計原則3:多用組合,少用繼承。
新聞熱點
疑難解答