Head First 策略模式

设计原则一

1、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
把会变化的部分取出来“封装”起来,以便以后可以轻易改动或扩充此部分

设计原则二

针对接口编程,而不是针对实现编程
利用接口代表行为,比如鸭子的fly-behavior ,而行为的每个实现都将实现一个接口

设计原则三

多用组合,少用集成

策略模式

策略模式定义的算法族, 分别封装起来,让他们之间可以互相转换,此模式让算法的变化独立于使用算法的客户
类似 鸭子的飞,叫的行为,有不同===> 算法的变化

基础类

public abstract class Duck {
    protected FlyBehavior flyBehavior;
    protected QuackBehavior quackBehavior;

    /**
     * 鸭子的外观
     */
    public abstract void display();

    /**
     * 游泳
     */
    public void swim() {
        System.out.println("我游啊游啊游......");
    }
    /**
     * 飞行
     */
    public void performFly() {
        //将飞行这件小事委托给行为类
        if (flyBehavior != null)
            flyBehavior.fly();
    }

    /**
     * 设置鸭子的飞行行为
     *
     * @param flyBehavior 飞
     */
    public void setFlyBehavior(FlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    /** * 叫  */
    public void performQuack() {
        //将浪叫这件小事委托给行为类
        if (quackBehavior != null)
            quackBehavior.quack();
    }
    /**
     * 设置鸭子叫的行为
     *
     * @param quackBehavior 叫
     */
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}

总结,这里把鸭子叫,非的不确定行为抽象出来,使用 组合的方式组合起来
但是鸭子确定的行为就可以保留在基类里

public interface FlyBehavior {
    /**
     * 飞行
     */
    void fly();
}

public interface QuackBehavior {
    /**
     * 叫
     */
    void quack();
}

这里想实现怎么飞就怎么飞,用翅膀,坐飞机,坐火箭。这样就能达到代码复用,只用维护一份,
比如这里实现用翅膀飞

public class FlyWithWings implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("我飞起来了!!!");
    }
}

实现一只绿头鸭

public class MallardDuck extends Duck {

    public MallardDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

    @Override
    public void display() {
        System.out.println("我可是一只货真价实的野鸭子!");
    }
}

测试

public static void main(String[] args) {

        System.out.println("Hello World!");
        Duck duck = new MallardDuck();
        duck.swim();
        duck.display();
        duck.performFly();
        duck.performQuack();

        //现在会飞了
        duck.setFlyBehavior(new FlyWithWings());
        duck.performFly();
        //可是不会叫了
        duck.setQuackBehavior(new MuteQuack());
        duck.performQuack();
    }

你可能感兴趣的:(Head First 策略模式)