设计模式:策略模式(对象的某个行为,在不同的场景中,有不同的实现算法)
2016-02-26 00:35
531 查看
前言
工作遇到的需求
在工作中,遇到这样的需求:需要对一些操作进行记账,比如说,客户购买了一笔资产A之后,那么客户的钱少了
客户的资产多了
商家的钱多了
商家的资产少了
等等
其实还有一些利息方面的变动,有 M 种变动,总之比较多。
而且这个只是考虑客户购买资产A,那么客户购买资产B ,资产C,这个变动还不一样,假设有 N 种 购买方式,那么就是 M * N 的可能变动。
思考的问题
如何重用
客户的购买行为,都会经过 预处理 -> 资产资金变动 ->后处理。预处理,后处理都是一样的,就是资产资金变动不同,那么怎么重用这个预处理,后处理呢。万一新增的一种购买方式和 客户购买资产A 很相像,那么能否利用上购买资产A的代码。
需求变更怎么办
万一又增加一种购买方式怎么办,能否做到很好的添加,删除也一样。万一客户购买资产A,需要加多一项变动,或者减少一项变动怎么办,怎么不对其他购买方式有影响。
当时在做这个需求的时候,主要就是参考了策略模式。
策略模式
什么是策略模式:引用 Wiki:是指对象的某个行为,在不同的场景中,有不同的实现算法。比如每个人都要交个人所得税,那么,在美国交个人所得税和在中国交个人所得税就不一样。那么,如何实现呢,引用网上的一个图:
分析一下策略模式的实现,其实也就是说,不同的算法有一个公共的父类,那么客户端在调用的时候,就 new 一个自己想要的算法即可。
其实来说,客户购买不同的资产,就可以看做是不同的策略,由于算法之间是隔离的,也就是说策略是隔离的,那么,我们对一个策略的修改,是不会影响别的策略的。另外,之前所以说的 预处理 -> 资产资金变动 ->后处理 的问题,我们就可以把预处理和后处理放在 具体策略的父类来做。
完成后的类结构图如下:
可以看到,首先 对外暴露了 AccountingRecord ,客户端直接使用内部的 strategyA 或者 strategyB 等 的 doExecute 方法(在CommonStategy中)即可,该方法自动 三步走,并且会调用具体 stategy 的资金资产变动处理的处理方法。 这样就解决了预处理,后处理的重用问题。那么 对于问题 万一新增的一种购买方式和 客户购买资产A 很相像,那么能否利用上购买资产A的代码? 我采用的方法像 strategyD 的处理方式 ,把公共部分提取到strategyD类中,留出特殊接口给子类实现。
这个就是我对于策略模式的实际使用和思考。
总结
什么是策略模式:是指对象的某个行为,在不同的场景中,有不同的实现算法。怎么实现,如下图:
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- 深入浅出23种设计模式
- 浅谈c#设计模式之单一原则
- 详解JavaScript的策略模式编程
- 解析C#设计模式编程中的装饰者模式