策略模式(二)

再次学习一下策略模式,加深理解,这个老外讲的非常好(个人意见)

/**
 * 策略的调用者 客户端
 *
 * @author qsm
 * @date 2020/05/26 21:14
 */
public abstract class Duck {

    private IFlyBehavior flyBehavior;

    private IQuackBehavior quackBehavior;

    private IDisplayBehavior displayBehavior;

    // 依赖注入
    public Duck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior,
            IDisplayBehavior displayBehavior) {
        this.flyBehavior = flyBehavior;
        this.quackBehavior = quackBehavior;
        this.displayBehavior = displayBehavior;
    }

    public void quack() {
        this.quackBehavior.quack();
    }

    public void display() {
        this.displayBehavior.display();
    }

    public void fly() {
        this.flyBehavior.fly();
    }

}

/**
 * @author qsm
 * @date 2020/05/26 21:20
 */
public class CloudDuck extends Duck {

    public CloudDuck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior, IDisplayBehavior displayBehavior) {
        super(flyBehavior, quackBehavior, displayBehavior);
    }

    // 假设 CloudDuck 的 fly 行为和 MountainDuck 的 fly 一样
    // 那么代码就重复了
    // 由此,将 fly 这个行为单独提取出来

}
/**
 * @author qsm
 * @date 2020/05/26 21:19
 */
public class MountainDuck extends Duck {

    public MountainDuck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior, IDisplayBehavior displayBehavior) {
        super(flyBehavior, quackBehavior, displayBehavior);
    }

    // 假设 CloudDuck 的 fly 行为和 MountainDuck 的 fly 一样
    // 那么代码就重复了
    // 由此,将 fly 这个行为单独提取出来

}
/**
 * @author qsm
 * @date 2020/05/26 21:15
 */
public class WildDuck extends Duck {

    // 这个地方根据情况注入具体的算法
    public WildDuck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior, IDisplayBehavior displayBehavior) {
        super(flyBehavior, quackBehavior, displayBehavior);

    }

    // 假设 WildDuck 的 display 行为和 MountainDuck 的 display 行为一样
    // 那么代码就重复了
    // 由此,将 eat 这个行为单独提取出来

    // 继承是垂直的,解决不了这种水平方向的复用

}
/**
 * 策略
 *
 * @author qsm
 * @date 2020/05/26 21:29
 */
public interface IFlyBehavior {

    void fly();

}
/**
 * 策略
 *
 * @author qsm
 * @date 2020/05/26 21:28
 */
public interface IQuackBehavior {

    void quack();

}
/**
 * 策略
 *
 * @author qsm
 * @date 2020/05/26 21:43
 */
public interface IDisplayBehavior {

    void display();

}
/**
 * 具体策略
 * 
 * @author qsm
 * @date 2020/05/28 23:21
 */
public class NoFly implements IFlyBehavior {

    @Override
    public void fly() {
        System.out.println("no fly");
    }

}
/**
 * 具体策略
 *
 * @author qsm
 * @date 2020/05/26 21:35
 */
public class SimpleFly implements IFlyBehavior {

    @Override
    public void fly() {
        System.out.println("simple fly");
    }

}
/**
 * 具体策略
 *
 * @author qsm
 * @date 2020/05/26 21:33
 */
public class NoQuack implements IQuackBehavior {

    @Override
    public void quack() {
        System.out.println("no quack");
    }

}
/**
 * 具体策略
 *
 * @author qsm
 * @date 2020/05/26 21:31
 */
public class SimpleQuack implements IQuackBehavior {

    @Override
    public void quack() {
        System.out.println("simple quack");
    }

}
/**
 * 具体策略
 *
 * @author qsm
 * @date 2020/05/26 21:44
 */
public class DisplayAsHtml implements IDisplayBehavior {

    @Override
    public void display() {
        System.out.println("display as html");
    }

}
/**
 * 具体策略
 *
 * @author qsm
 * @date 2020/05/26 21:44
 */
public class DisplayAsText implements IDisplayBehavior {

    @Override
    public void display() {
        System.out.println("display as text");
    }

}

测试

    @Test
    public void test01() {
        Duck mountainDuck =
                new MountainDuck(new SimpleFly(), new SimpleQuack(), new DisplayAsHtml());
        mountainDuck.fly();
        mountainDuck.quack();
        mountainDuck.display();

        System.out.println("\n");

        Duck cloudDuck = new CloudDuck(new SimpleFly(), new NoQuack(), new DisplayAsText());
        cloudDuck.fly();
        cloudDuck.quack();
        cloudDuck.display();

        System.out.println("\n");

        Duck wildDuck = new WildDuck(new NoFly(), new NoQuack(), new DisplayAsHtml());
        wildDuck.fly();
        wildDuck.quack();
        wildDuck.display();
    }

查看结果
策略模式(二)_第1张图片

你可能感兴趣的:(设计模式)