二十三种设计模式(第二十二种)-----策略模式(Strategy)
尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470
类图
从上图可以看到,客户context有成员变量strategy或者其他的策略接口,至于需要使用到那个策略,我们可以在构造器中指定
需求
有各种鸭子(如:野鸭、北京鸭、水鸭等,鸭子有各种行为,比如叫、飞行等待)
显示鸭子的信息
需求类图
代码
1.鸭子抽象类
public abstract class Duck {
//策略接口
protected FlyBehavior flyBehavior;
public abstract void display();
public void quack() {
System.out.println("鸭子嘎嘎叫~~~");
}
public void swim() {
System.out.println("鸭子会游泳~~~");
}
public void fly() {
if (flyBehavior != null) {
flyBehavior.fly();
}
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
}
2.鸭子飞接口
public interface FlyBehavior {
void fly();
}
3.不同鸭子实现类
public class WildDuck extends Duck {
public WildDuck() {
flyBehavior = new GoodFlyBehavior();
}
@Override
public void display() {
System.out.println("这是野鸭....");
}
}
//================================
public class PekingDuck extends Duck {
public PekingDuck() {
flyBehavior = new BadFlyBehavior();
}
@Override
public void display() {
System.out.println("这是北京鸭子...");
}
}
//================================
public class ToyDuck extends Duck {
public ToyDuck() {
flyBehavior = new NoFlyBehavior();
}
@Override
public void display() {
System.out.println("这是玩具鸭...");
}
@Override
public void quack() {
System.out.println("玩具鸭不能叫...");
}
@Override
public void swim() {
System.out.println("玩具鸭不能游泳...");
}
}
4.不同飞实现类
public class GoodFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞翔技术高超...");
}
}
//================================
public class BadFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞翔技术一般...");
}
}
//================================
public class NoFlyBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("不会飞...");
}
}
5.客户端
public class Strategy {
public static void main(String[] args) {
WildDuck wildDuck = new WildDuck();
wildDuck.fly();
PekingDuck pekingDuck = new PekingDuck();
pekingDuck.fly();
ToyDuck toyDuck = new ToyDuck();
toyDuck.fly();
//更改pekingDuck飞行行为
pekingDuck.setFlyBehavior(new NoFlyBehavior());
pekingDuck.fly();
}
}
策略模式在JDK的Arrays.sort()方法中实现
参数Comparator接口为策略接口