策略设计模式
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计原则:
1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程
3、多用组合,少用继承
案例代码:
/**
*飞行行为接口
*/
public interface FlyBehavior { void fly(); } class FlyWithWings implements FlyBehavior { @Override public void fly() { System.out.println("duck fly with wings"); } } class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("can't fly"); } } class FlyRocketPowered implements FlyBehavior{ @Override public void fly() { System.out.println("I'm flying with a rocket"); } }
/** * 叫声行为接口 * * @author guoxin */ public interface QuackBehavior { void quack(); } class Quack implements QuackBehavior { @Override public void quack() { System.out.println("ga ga ga ..."); } } class Squeak implements QuackBehavior { @Override public void quack() { System.out.println("zi zi zi ..."); } } class MuteQuack implements QuackBehavior { @Override public void quack() { System.out.println("can't quack"); } }
/** * 抽象鸭子类 * * @author guoxin */ public abstract class AbstractDuck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; void performQuack() { quackBehavior.quack(); } void performFly() { flyBehavior.fly(); } void swim() { System.out.println("All dicks float, enen decoys!"); } abstract void display(); public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
/** * 绿头鸭 * * @author guoxin */ public class MallardDuck extends AbstractDuck { MallardDuck() { flyBehavior = new FlyWithWings(); quackBehavior = new Quack(); } @Override void display() { System.out.println("I'm a real Mallard duck"); } }
/** * 模型鸭 * * @author guoxin */ public class ModelDuck extends AbstractDuck { public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } @Override void display() { System.out.println("I'am a model duck"); } }
/** * 测试方法 * * @author guoxin */ public class MiniDuckSimulator { public static void main(String[] args) { AbstractDuck ad = new MallardDuck(); ad.performFly(); ad.performQuack(); AbstractDuck model = new ModelDuck(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }
类图