一、是什么?作用?
策略模式的思想是定义一些算法族,分别封装起来,让他们可以相互替换,此模式让算法的变化独立于使用算法的客户
策略模式的适用场景:
- 当一个系统中有许多类,它们之间的区别仅在于它们的行为,希望动态地让一个对象在许多行为中选择一种行为时;
- 当一个系统需要动态地在几种算法中选择一种时;
- 当一个对象有很多的行为,不想使用多重的条件选择语句来选择使用哪个行为时。
二、使用实例
场景:鸭子分为绿头鸭和模型鸭子,以后还能有其他鸭子,绿头鸭可以呱呱叫,也可以用翅膀飞,模型鸭子可以呱呱叫,但是不能飞
1. 定义飞的接口行为
/** * 飞的接口类 */ public interface FlyBehavior { void fly(); } // ============================ /** * 用翅膀飞 - 实现类 */ public class FlyWithWings implements FlyBehavior { @Override public void fly() { System.out.println("I'm flying"); } } // ========================= /** * 不会飞 - 实现类 */ public class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("I can't fly"); } }
2. 定义叫的接口行为
/** * 叫的接口类 */ public interface QuackBehavior { void quack(); } // ======================= /** * 咕咕叫 */ public class MuteQuack implements QuackBehavior { @Override public void quack() { System.out.println("咕咕叫"); } } // ======================= /** * 嘎嘎叫 */ public class Squeak implements QuackBehavior { @Override public void quack() { System.out.println("嘎嘎叫"); } }
3. 编写鸭子类, 注意这里有的是组合
/** * 鸭子类 基类, 注: 这里可以写给set行为的方法,方便动态设置行为 */ public abstract class Duck { private FlyBehavior flyBehavior; private QuackBehavior quackBehavior; public Duck() { } // 执行飞的动作 public void performFly() { flyBehavior.fly(); } // 执行叫的动作 public void performQuack() { quackBehavior.quack(); } } /** * 绿头野鸭类 注意点: 就在鸭子的行为在这个时候赋值给鸭子, 想换别的行为随便换 */ public class MallardDuck extends Duck{ public MallardDuck() { this.flyBehavior = new FlyWithWings(); this.quackBehavior = new MuteQuack(); } }
4. 测试
/** * 小鸭子测试类 */ public class MiniDuckSimulator { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performFly(); mallard.performQuack(); } }
三、总结
1.如果是以前我很可能有鸭子抽象类来定义飞的行为,子类重写飞的行为,当忽然添加另外一种鸭子,它有特殊的行飞的行为(带火箭喷射器的翅膀),这时候又得重写这个行为,不管什么鸭子,我都得重写他的飞的行为;
2. 如果用了策略模式,只需要要编写这个特殊飞的行为,然后在这只鸭身上赋上这种行为就行了,其他已经编写的代码一点都没有收到影响,牛批