再次学习一下策略模式,加深理解,这个老外讲的非常好(个人意见)
/**
* 策略的调用者 客户端
*
* @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();
}