策略模式:定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.此模式主要使用的设计原则是依赖倒置原则.
使用鸭子来举个列子,鸭子分为家鸭,野鸭,木头鸭。家鸭能叫不能飞,野鸭能叫又能飞,木头鸭不能叫也不能飞。 那么我们就可以把飞和叫定义为两个不同的算法族。
飞行算法族:
/** *飞行算法族 * @author zhuleqi */public interface FlyBehavior { public void fly();}
/** *使用翅膀飞行 * @author zhuleqi */public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.err.println("fly with wing"); } }
/** *不能飞行 * @author zhuleqi */public class NoFly implements FlyBehavior{ @Override public void fly() { System.err.println("I can't fly"); } }
叫算法族:
/** *叫算法族 * @author zhuleqi */public interface QuackBehavior { public void quack();}
/** * * @author zhuleqi */public class NormalQuack implements QuackBehavior{ @Override public void quack() { System.err.println("我是一只正常叫的鸭子"); } }
/** * * @author zhuleqi */public class NoQuack implements QuackBehavior{ @Override public void quack() { System.err.println("I can not quack"); } }
这两个算法族都使用了依赖倒置的原则,这个原则的好处是:易于扩展。比如:某天突然需要增加一个安装了火箭喷射器的唐老鸭,我们就只需要在实现这两个算法接口,而不用破坏程序结构。
算法族的使用者鸭子:
/** * 算法族的客户 * @author zhuleqi */public class Duck { /** * 鸭子的飞行行为 */ private FlyBehavior flyBehavior; /** * 鸭子的叫 */ private QuackBehavior quackBehavior; public void display() { System.err.println(" 我是鸭子"); } public void swim() { System.err.println(" 我可以在水里游"); } public void fly() { if(this.getFlyBehavior() == null){ return; } this.getFlyBehavior().fly(); } public void quack() { if(this.getQuackBehavior() == null){ return ; } this.getQuackBehavior().quack(); } /** * @return the flyBehavior */ public FlyBehavior getFlyBehavior() { return flyBehavior; } /** * @param flyBehavior the flyBehavior to set */ public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } /** * @return the quackBehavior */ public QuackBehavior getQuackBehavior() { return quackBehavior; } /** * @param quackBehavior the quackBehavior to set */ public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
执行一下:
/** * 策略模式定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.主要使用的设计原则是依赖倒置原则. * * @author zhuleqi */public class Strategy { public static void main(String[] args) { Duck duck = new Duck(); duck.setFlyBehavior(new FlyWithWings()); duck.setQuackBehavior(new NormalQuack()); print(duck); } private static void print(Duck duck) { duck.display(); duck.fly(); duck.quack(); }}