策略模式

  1. 定义

Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)


  • 通用类图

  • 三个角色

    • Context封装角色

    它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。 理解成:执行的抽象逻辑,比如用户计算返奖策略,这里并不关心如何计算出返将金额的,只知道有返奖这个流程

    • Strategy抽象策略角色

    理解:定义一个接口,会不同的子类实现具体的策略

    • ConcreteStrategy具体策略角色

    实现抽象策略中的操作,该类含有具体的算法。

  • 通用代码

public interface Strategy {
//策略模式的运算法则
public void doSomething();
}
  • 策略角色
public class ConcreteStrategy1 implements Strategy {
public void doSomething() {
System.out.println("具体策略1的运算法则");
}
}
public class ConcreteStrategy2 implements Strategy {
public void doSomething() {
System.out.println("具体策略2的运算法则");
}
}
  • 封装角色
public class Context {
//抽象策略
private Strategy strategy = null;
//构造函数设置具体策略
public Context(Strategy _strategy){
this.strategy = _strategy;
}
//封装后的策略方法
public void doAnythinig(){
this.strategy.doSomething();
}
}
  • 调用
public class Client {
public static void main(String[] args) {
//声明一个具体的策略
Strategy strategy = new ConcreteStrategy1();
//声明上下文对象
Context context = new Context(strategy);
//执行封装后的方法
context.doAnythinig();
}
}
  • 策略模式优点
    • 算法可以自由切换
    • 避免使用多重条件判断
    • 扩展性良好
  • 策略模式缺点
    • 策略类数量增多
    • 所有的策略类都需要对外暴露
  1. 举个粟子 业务场景:用户A邀请用户B,B成功下单后,根据B下单类型给A计算不同的奖励(返奖策略)。 [粟子链接地址][1] 在实际项目中,我们一般通过工厂方法模式来实现策略类的声明 [1]: https://zhuanlan.zhihu.com/p/114531948 "粟子链接地址"
end
  • 作者:tmq(联系作者)
  • 发表时间:2020-11-19 16:58
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论