设计模式:策略模式(对象的某个行为,在不同的场景中,有不同的实现算法)

时间:2021-07-11 21:55:58

前言


工作遇到的需求

在工作中,遇到这样的需求:需要对一些操作进行记账,比如说,客户购买了一笔资产A之后,那么

  • 客户的钱少了
  • 客户的资产多了
  • 商家的钱多了
  • 商家的资产少了
  • 等等

其实还有一些利息方面的变动,有 M 种变动,总之比较多。

而且这个只是考虑客户购买资产A,那么客户购买资产B ,资产C,这个变动还不一样,假设有 N 种 购买方式,那么就是 M * N 的可能变动。

思考的问题

如何重用

  1. 客户的购买行为,都会经过 预处理 -> 资产资金变动 ->后处理。预处理,后处理都是一样的,就是资产资金变动不同,那么怎么重用这个预处理,后处理呢。
  2. 万一新增的一种购买方式和 客户购买资产A 很相像,那么能否利用上购买资产A的代码。

需求变更怎么办

  1. 万一又增加一种购买方式怎么办,能否做到很好的添加,删除也一样。
  2. 万一客户购买资产A,需要加多一项变动,或者减少一项变动怎么办,怎么不对其他购买方式有影响。

当时在做这个需求的时候,主要就是参考了策略模式。

策略模式


什么是策略模式:引用 Wiki:是指对象的某个行为,在不同的场景中,有不同的实现算法。比如每个人都要交个人所得税,那么,在美国交个人所得税和在中国交个人所得税就不一样。

那么,如何实现呢,引用网上的一个图:

设计模式:策略模式(对象的某个行为,在不同的场景中,有不同的实现算法)

分析一下策略模式的实现,其实也就是说,不同的算法有一个公共的父类,那么客户端在调用的时候,就 new 一个自己想要的算法即可。

其实来说,客户购买不同的资产,就可以看做是不同的策略,由于算法之间是隔离的,也就是说策略是隔离的,那么,我们对一个策略的修改,是不会影响别的策略的。另外,之前所以说的 预处理 -> 资产资金变动 ->后处理 的问题,我们就可以把预处理和后处理放在 具体策略的父类来做。

完成后的类结构图如下:
设计模式:策略模式(对象的某个行为,在不同的场景中,有不同的实现算法)

设计模式:策略模式(对象的某个行为,在不同的场景中,有不同的实现算法)

可以看到,首先 对外暴露了 AccountingRecord ,客户端直接使用内部的 strategyA 或者 strategyB 等 的 doExecute 方法(在CommonStategy中)即可,该方法自动 三步走,并且会调用具体 stategy 的资金资产变动处理的处理方法。 这样就解决了预处理,后处理的重用问题。那么 对于问题 万一新增的一种购买方式和 客户购买资产A 很相像,那么能否利用上购买资产A的代码? 我采用的方法像 strategyD 的处理方式 ,把公共部分提取到strategyD类中,留出特殊接口给子类实现。

这个就是我对于策略模式的实际使用和思考。

总结


  1. 什么是策略模式:是指对象的某个行为,在不同的场景中,有不同的实现算法
  2. 怎么实现,如下图:

设计模式:策略模式(对象的某个行为,在不同的场景中,有不同的实现算法)