前言
设计模式系列目录
策略模式(Strategy Pattern) 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
类图
理解思路最重要。如有纰漏或者更好更简单的方法,欢迎探讨。
代码
来,上代码
https://github.com/software-market/design-pattern(欢迎star,谢谢各位大佬。)
FlyBehavior接口
public interface FlyBehavior {
void fly();
}
Fly1、Fly2实现
public class Fly1 implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞行策略1");
}
}
public class Fly2 implements FlyBehavior {
@Override
public void fly() {
System.out.println("飞行策略2");
}
}
QuackBehavior接口
public interface QuackBehavior {
void quack();
}
Quack1、Quack2实现
public class Quack1 implements QuackBehavior{
@Override
public void quack() {
System.out.println("叫声策略1");
}
}
public class Quack2 implements QuackBehavior{
@Override
public void quack() {
System.out.println("叫声策略2");
}
}
Duck抽象类
public abstract class Duck {
private FlyBehavior flyBehavior;
private QuackBehavior quackBehavior;
void fly(){
flyBehavior.fly();
}
void quack(){
quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
测试类
public class Test {
public static void main(String[] args) {
Duck duck = new MyDuck1();
duck.setFlyBehavior(new Fly1()); // 设置飞行策略1
duck.setQuackBehavior(new Quack1()); // 设置呱呱策略1
duck.fly(); // 执行的是飞行策略1
duck.quack(); // 执行的是叫声策略1
// 动态改变策略
duck.setFlyBehavior(new Fly2()); // 设置飞行策略2
duck.setQuackBehavior(new Quack2()); // 设置叫声策略2
duck.fly(); // 执行的是飞行策略2
duck.quack(); // 执行的叫声策略2
}
}
执行结果:
飞行策略1
叫声策略1
飞行策略2
叫声策略2
总结
其实就是抽象类中持有接口,此时是类将行为委托出去了。
被委托接口的众多实现类就叫做算法族或者称为众多策略。
类中包含setter方法,可以随时变更策略,调用者只需要选择策略和执行策略即可。