策略模式
定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户。
设计原则1
找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
设计原则2
针对接口编程,而不是针对实现编程。
设计原则3
多用组合,少用继承。
下面简单的代码描述了不同的角色用武器加入战斗,同时它们也可以切换武器。
话不多说,直接撸代码
1.角色抽象类BaseCharacter
/** * 角色抽象类 * @author monkjavaer * @date 2018/08/18 10:35 */ public abstract class BaseCharacter { WeaponBehavior weaponBehavior; public BaseCharacter(){ } /** * 切换武器 * @param weaponBehavior */ public void setWeaponBehavior(WeaponBehavior weaponBehavior) { System.out.println("set weapon"); this.weaponBehavior = weaponBehavior; } /** * 用不同武器战斗 */ public abstract void fight(); /** * 所有继承这个抽象类的都可以说hello */ public void sayHello(){ System.out.print("hello!"); } }
1.1国王继承角色
/** * @author monkjavaer * @date 2018/08/18 11:30 */ public class King extends BaseCharacter{ public King() { weaponBehavior = new KnifeBehavior(); } @Override public void fight(){ System.out.print("king fight:"); weaponBehavior.useWeapon(); } }
1.2皇后类继承角色
/** * @author monkjavaer * @date 2018/08/18 11:32 */ public class Queen extends BaseCharacter { public Queen() { weaponBehavior = new KnifeBehavior(); } @Override public void fight() { System.out.print("Queen fight:"); weaponBehavior.useWeapon(); } }
2.武器接口WeaponBehavior
/** * 武器接口 * @author monkjavaer * @date 2018/08/18 10:38 */ public interface WeaponBehavior { /** * 使用武器 */ void useWeapon(); }
2.1匕首类实现武器接口
/** * 匕首 * @author monkjavaer * @date 2018/08/18 11:36 */ public class KnifeBehavior implements WeaponBehavior { @Override public void useWeapon() { System.out.println("use Knife"); } }
2.2宝剑实现武器接口
/** * 宝剑 * @author monkjavaer * @date 2018/08/18 11:35 */ public class SwordBehavior implements WeaponBehavior { @Override public void useWeapon() { System.out.println("use Sword"); } }
测试类
public static void main(String[] args) { BaseCharacter king = new King(); king.sayHello(); king.fight(); king.setWeaponBehavior(new SwordBehavior()); king.fight(); BaseCharacter queen = new Queen(); queen.fight(); }