問題: Character是角色類,是抽象類,由具體的角色來繼承,Weapon是武器介面,有具體的武器來實現。任何角色想換武器可以有setWeapon方法來實現,在角色fight過程中使用武器的useWeapon方法,進行攻擊。 UML: 策略模式: 定義了演算法族,分別封裝起來,讓他們之間可以互相替 ...
問題:
Character是角色類,是抽象類,由具體的角色來繼承,Weapon是武器介面,有具體的武器來實現。任何角色想換武器可以有setWeapon方法來實現,在角色fight過程中使用武器的useWeapon方法,進行攻擊。
UML:
策略模式: 定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。
將WeaponBehavior封裝成介面,介面的實現可以相互替換。
原則:
- 封裝變化
把系統中會變化的部分抽取出來進行封裝。此處將WeaponBehavior封裝起來。
- 多用組合,少用繼承
將角色類和武器類進行組合,少用繼承。
- 針對介面編程,不針對實現編程
實現武器的介面,並不是通過角色類自己來實現。
源碼:
Character.java
1 /** 2 * Created by Edward on 2016/7/9. 3 */ 4 public abstract class Character { 5 protected WeaponBehavior weapon; 6 public abstract void fight(); 7 public void setWeapon(WeaponBehavior weapon) 8 { 9 this.weapon = weapon; 10 } 11 }
WeaponBehavior.java
1 /** 2 * Created by Edward on 2016/7/9. 3 */ 4 public interface WeaponBehavior { 5 void useWeapon(); 6 }
King.java
1 /** 2 * Created by Edward on 2016/7/9. 3 */ 4 public class King extends Character { 5 @Override 6 public void fight() { 7 this.weapon.useWeapon(); 8 } 9 }
SwordBehavior.java
1 /** 2 * Created by Edward on 2016/7/9. 3 */ 4 public class SwordBehavior implements WeaponBehavior { 5 @Override 6 public void useWeapon() { 7 System.out.println("use Sword!"); 8 } 9 }
測試類:
1 /** 2 * Created by Edward on 2016/7/9. 3 */ 4 public class Test { 5 6 public static void main(String[] args) { 7 Character king = new King(); 8 WeaponBehavior sword = new SwordBehavior(); 9 king.setWeapon(sword); 10 king.fight(); 11 } 12 }
參考自《設計模式》