结构型——策略模式

什么是策略模式

在软件开发过程中,某些行为可能具有不同的实现方式,比如,对于排序这一行为,其具体实现可能包括堆排序、插入排序、选择排序、希尔排序、快速排序等等,这些实现方式有着各自的应用场景。在软件运行过程中,对于某种行为,我们希望能够动态选择具体实现方式。这时候就需要用到策略模式了。

那什么是策略模式呢?

策略模式通常定义为: 定义了一系列算法(行为的具体实现),并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。 其目的在于,解耦行为与行为的具体实现,把行为的具体实现委派给其他对象。

策略模式具有如下优缺点:

  • 优点
    • 封装,将行为的具体实现进行封装,方便在多处使用;
    • 解耦,解耦了行为与行为的具体实现,降低耦合度;
    • 开闭原则,可以灵活的添加或删除行为。
  • 缺点
    • 类变多了,增加维护难度;
    • 客户端要理解所有策略算法的区别,调用合适的策略算法。

策略模式的实现

了解了什么是策略模式,下面看看如何实现策略模式。

策略模式主要有3个角色:

  • 抽象策略接口:定义一个公共接口behavior();
  • 具体策略类:实现抽象策略接口,负责策略的具体实现;
  • 环境类:需要使用调用某种算法或行为的对象,通过成员变量形式调用算法。

策略模式的类图如下:

可以看到,整个结构非常简单,这里就不给出具体代码实现了。

策略模式的应用

能用到策略模式的地方有很多,简单来说,当某种功能有多种实现方式时,你就可以考虑使用策略模式!

比如电商系统中优惠方案和支付方式、差旅系统中出行方案、排序系统中的排序方案等等。

下面举几个策略模式在JDK和Spring中的应用实例。

  • JDK中的应用
    • 比如Java中的比价器Comparator接口,我们经常把Comparator接口作为传入参数实现排序策略。这里Comparator相当于抽象策略类,我们实现该接口,并实现compare方法,就相当于构建了一个具体策略类。
  • Spring中的应用
    • 在Spring中的一个经典应用就是“初始化”,不同类型的类采用不同的初始化策略。
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Yin Peng
  • 引擎: Hexo   |  主题:修改自 Ayer
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信