我是不是该使用策略模式?

黑娃 2017-12-13 08:02:54
我有一个状态机,大家可以把它想成是一个叫M的类,状态机M中存在一个成员F,F中又有很多方法,一开始F挺单纯的,后来功能扩展,F越来越复杂,增加的接口越来越多。实际上F中有一个属性叫做Version,它会直接影响M状态机的变迁,例如Version==1的时候M的循环路线可能是A-B-C-D-A,Version==2的时候可能就是A-S-X-C-D-A了,我现在的做法就是让F成为一个大杂烩,依靠Version来走不同的逻辑,但是我觉得这种感觉不太好,F越发臃肿,一些接口和成员可以通用,一些却只能都在特定Version下才有意义,不管是M还是F,一些逻辑分支下都是靠if-else version来实现的,如果再这样臃肿下去,势必会越发难以理解和维护。
然后我就想到了策略模式,但是有几个问题不太肯定:
1、我理解的策略模式除了一个继承树,还要把基类作为成员装到另外一个类里面。用我的例子来说,F就是那个抽象基类,我之前各种Version扩展出来的就继承为F1,F2,F3,...,而M就是使用策略的那个“另一个类”。不知道这个理解是不是正确?
2、还有一个关键,就是这些策略需要有共性,就是virtual fun的接口得可以抽象成一样的,在我的例子里面,它们既有共性又有很不一样的地方,就连策略使用者M都会根据F的某些特点而做出不同的状态变迁路径,我不知道这样的情况究竟合不合适使用所谓的策略模式?
...全文
727 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
考拉一枚 2018-03-06
  • 打赏
  • 举报
回复
例如Version==1的时候M的循环路线可能是A-B-C-D-A,Version==2的时候可能就是A-S-X-C-D-A了 我觉得你这里都可以抽象出一个class(interface),让不同循环路线的M去继承或实现, 另外不太清楚M是怎么去用F,如果能抽象出共同接口用策略模式挺合适的
stendson 2018-01-17
  • 打赏
  • 举报
回复
1. 首先你需要理清M与F、F与Version为什么是Has-a的关系,为什么M需要根据Version的值来决定自己的策略 2. 你理解的策略模式是正确的,但是如果策略的接口很不一样,你需要考虑这些策略之间根本不存在任何关系,不能使用继承,可以将这些策略用不同的类来封装;比如 Version=1时,实例化 F1和M1,Version=2时,实例化F2和M2,这样就可以保证F1和M1、F2和M2之间的接口一致性,在调用时也不存在歧义
策略模式(Strategy Pattern)详解 1. 什么是策略模式? 2. 为什么需要策略模式? 3. 策略模式的核心概念 3.1 策略(Strategy) 3.2 具体策略(Concrete Strategy) 3.3 上下文(Context) 4. 策略模式的结构 5. 策略模式的基本实现 5.1 基础示例:不同的支付策略 5.2 基础示例:不同的排序策略 6. 策略模式的高级实现 6.1 使用枚举实现策略模式 6.2 使用Lambda表达式实现策略模式 6.3 使用策略工厂 7. 策略模式在Java中的实际应用 7.1 Java Collections Framework中的排序 7.2 线程池中的拒绝策略 7.3 Spring框架中的策略模式 8. 策略模式与其他设计模式的比较 8.1 策略模式 vs 状态模式 8.2 策略模式 vs 命令模式 8.3 策略模式 vs 工厂模式 8.4 策略模式 vs 模板方法模式 9. 策略模式的优缺点 9.1 优点 9.2 缺点 10. 何时使用策略模式? 10.1 实际应用场景 10.2 Java中常见的策略模式应用 11. 常见问题与解决方案 11.1 策略选择问题 11.2 参数传递问题 11.3 策略组合问题 12. 策略模式的最佳实践 12.1 设计建议 12.2 代码示例:优化的策略实现 12.3 性能考虑 13. 策略模式的最佳实践 13.1 设计建议 13.2 代码示例:优化的策略实现 13.3 性能考虑 14. 总结 14.1 核心要点 14.2 常见应用场景 14.3 与Java 8+的结合 14.4 最终建议

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧