策略设计模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计原则:

  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();
    }
}

类图

 

posted @ 2019-01-15 22:04  郭鑫  阅读(148)  评论(0编辑  收藏  举报