策略模式
1.定义
定义了算法族,分别封装起来,让它们之前可以互相替换,此模式让算法的变化独立于使用算法的客户.
2.代码演示------来自head first 设计模式
假设有许多鸭子,绿头鸭,模型鸭,玩具鸭,有的鸭子会飞,有的鸭子会叫,有的鸭子不会飞,有的鸭子不会叫,这边会飞和不会飞,会叫和不会叫都是相同的行为,一个是飞,一个是不会飞,这边可以单独抽象成两个接口
定义一个飞行接口
public interface FlyBehavior { void fly(); }
定义一个'叫'接口
public interface QuackBehavior { void quack(); }
然后飞行行为可以有 靠翅膀飞行,或者靠一个火箭飞行器飞行,实现类分别如下
public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.out.println(" fly with wings"); } }
public class FlyNoWay implements FlyBehavior{ @Override public void fly() { System.out.println("fly no way"); } }
public class FlyRocketPowered implements FlyBehavior{ @Override public void fly() { System.out.println("I'm flying with a rocket!"); } }
'叫'行为可以有呱呱叫(quack),吱吱叫(squeak),和不发出叫声(mutesquack),实现类如下
public class Quack implements QuackBehavior{ @Override public void quack() { System.out.println("quack quack quack"); } }
public class Squeak implements QuackBehavior{ @Override public void quack() { System.out.println("Squeak Squeak Squeak"); } }
public class MuteQuack implements QuackBehavior{ @Override public void quack() { System.out.println("MuteQuack MuteQuack MuteQuack"); } }
定义了鸭子的各种行为实现后,我们就可以定义抽象类鸭子了,这边有意思的就是把行为都抽象成一个方法,'不会飞'也单独作为一个类来表示
定义抽象鸭子类
public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; void performQuack() { quackBehavior.quack(); } void performFly() { flyBehavior.fly(); } public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
这边通过组合来实现 飞行为 和'叫'行为,如果是不会飞的鸭子,直接把 FlyNoWay赋值给 flyBehavior类即可.
编写测试类
public class MiniDuckSimulator { public static void main(String[] args) { Duck model = new ModelDuck(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }
这里我们可以看到,通过set方法可以随时改变行为(策略);
3.总结
鸭子的 飞 和叫 可以抽象成行为,通过组合方式来实现每一种鸭子的行为. 就是给抽象成接口的行为赋值来实现具体的 飞 和叫 ;