標籤:java設計模式 策略模式
什麼是策略模式?
定義演算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。
策略模式有什麼好處?
可以動態改變對象的行為。
設計原則
1.封裝變化(找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起)2.多用組合,少用繼承3.針對介面編程,不針對實現編程
把一個類中經常改變或者將來可能改變的部分提取出來,作為一個介面;然後在基類中包含這個對象的執行個體,這樣類的執行個體在運行時就可以隨意調用實現了這個介面的類的行為。
策略模式屬於對象行為型模式,主要針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到用戶端的情況下發生變化。通常,策略模式適用於當一個應用程式需要實現一種特定的服務或者功能,而且該程式有多種實現方式時使用。
策略模式中有三個對象
1.環境對象:該類中實現了對抽象策略中定義的介面或者抽象類別的引用2.抽象策略對象:它可由介面或抽象類別來實現3.具體策略對象:它封裝了實現同不功能的不同演算法
利用策略模式構建應用程式,可以根據使用者配置等內容,選擇不同有演算法來實現應用程式的功能。具體的選擇有環境對象來完成。採用這種方式可以避免由於使用條件陳述式而帶來的代碼混亂,提高應用程式的靈活性與條理性。
執行個體分析
設計一個動作冒險遊戲,遊戲中有不同的角色和不同的武器,每種武器攻擊方式和殺傷力都不一樣,每個角色都具有戰鬥的技能,在遊戲中都可以換武器
根據情境可以建立基類Role,該類中包含戰鬥fight()方法,還包含設定武器行為的方法setWeapon();(環境對象)建立武器行為介面,包含使用武器方法,不同的武器實現該介面;(抽象策略對象)不同的角色設定不同的武器行為子類對象(具體策略對象)
1.Role類
package com.pattern.strategy.role;import com.pattern.strategy.weapon.IWeaponBehavior;public abstract class Role { IWeaponBehavior mWeaponBehavior; public void fight() { if (mWeaponBehavior != null) { mWeaponBehavior.useWeapon(); } } public void setWeaponBehavior (IWeaponBehavior weaponBehavior) { mWeaponBehavior = weaponBehavior; } public abstract void move();}
2.具體角色類--King,Queen..
package com.pattern.strategy.role;import com.pattern.strategy.util.Tools;public class King extends Role { @Override public void move() { Tools.print("King move"); }}
package com.pattern.strategy.role;import com.pattern.strategy.util.Tools;public class Queen extends Role { @Override public void move() { Tools.print("Queen move"); }}
3.抽象策略對象介面-IWeaponBehavior
package com.pattern.strategy.weapon;public interface IWeaponBehavior { public void useWeapon();}
4.具體策略對象類,AxeBehavior(使用斧頭),KnifeBehavior(使用匕首),SwordBehavior(使用劍)
package com.pattern.strategy.weapon;import com.pattern.strategy.util.Tools;public class AxeBehavior implements IWeaponBehavior { @Override public void useWeapon() { Tools.print("AxeBehavior"); }}
package com.pattern.strategy.weapon;import com.pattern.strategy.util.Tools;public class KnifeBehavior implements IWeaponBehavior { @Override public void useWeapon() { Tools.print("KnifeBehavior"); }}
package com.pattern.strategy.weapon;import com.pattern.strategy.util.Tools;public class SwordBehavior implements IWeaponBehavior { @Override public void useWeapon() { Tools.print("SwordBehavior"); }}
5.工具類Tools和測試類別StrategyMode
package com.pattern.strategy.util;public class Tools { public static void print(String info) { System.out.println(info); }}
package com.pattern.strategy;import com.pattern.strategy.role.King;import com.pattern.strategy.role.Queen;import com.pattern.strategy.role.Role;import com.pattern.strategy.weapon.AxeBehavior;import com.pattern.strategy.weapon.KnifeBehavior;import com.pattern.strategy.weapon.SwordBehavior;public class StrategyMode { public static void main(String[] args) { Role role = new King(); role.setWeaponBehavior(new AxeBehavior()); role.fight(); role.move(); role.setWeaponBehavior(new SwordBehavior()); role.fight(); role = new Queen(); role.setWeaponBehavior(new KnifeBehavior()); role.fight(); role.move(); }}
6.運行結果
AxeBehavior
King move
SwordBehavior
KnifeBehavior
Queen move
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
JAVA設計模式之策略模式