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

黑娃 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的某些特点而做出不同的状态变迁路径,我不知道这样的情况究竟合不合适使用所谓的策略模式?
...全文
708 2 打赏 收藏 转发到动态 举报
写回复
用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之间的接口一致性,在调用时也不存在歧义

5,530

社区成员

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

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