策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
不是所有的鸭子都会飞或者叫,只有部分的鸭子会飞和叫,所以把这些变化的抽离出来写成接口,然后写出接口实现类,鸭子根据不同的行为去调用这些类。
项目中一般 serviceimpl实现了 service,在controller 选择合适的service的实现类 。这里就用到了策略模式
Duck类
public abstract class Duck {
//这里创建 FlyBehavior 和 QuackBehavior 对象 而不去实现接口 ,是为了 FlyBehavior 和 QuackBehavior 子类的复用
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public abstract void display() ;
public void fly() {
flyBehavior.fly();
}
public void quackBehavior() {
quackBehavior.quack();
}
}
FlyBehavior
public interface FlyBehavior {
void fly();
}
QuackBehavior
public interface QuackBehavior {
void quack();
}
NoFlyBehavior
public class NoFlyBehavior implements FlyBehavior{
public void fly() {
System.out.println("不会飞");
}
}
FlyBehavior1
public class FlyBehavior1 implements FlyBehavior{
public void fly() {
System.out.println("直线飞");
}
}
NoQuackBehavior
public class NoQuackBehavior implements QuackBehavior{
public void quack() {
System.out.println("不会叫");
}
}
QuackBehavior1
public class QuackBehavior1 implements QuackBehavior{
public void quack() {
System.out.println("呱呱叫");
}
}
BlueDuck
public class BlueDuck extends Duck {
public BlueDuck() {
}
public BlueDuck(FlyBehavior flyBehavior, QuackBehavior quackBehavior) {
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
@Override
public void display() {
System.out.println("我是一只小蓝鸭");
}
}
YellowDuck
public class YellowDuck extends Duck {
public YellowDuck() {
}
public YellowDuck(FlyBehavior flyBehavior, QuackBehavior quackBehavior) {
this.flyBehavior = flyBehavior;
this.quackBehavior = quackBehavior;
}
@Override
public void display() {
System.out.println("我是一只小黄鸭");
}
}