“国家模式”与“每个州的一个成员职能”?

时间:2016-06-01 09:26:58

标签: c++ design-patterns state member-function-pointers

我的班级有3个州。在每个州,它做一些工作,并进入其他状态,或保持相同的状态(在95%或更多的情况下,它将保持在相同的状态)。我可以实现状态模式(我假设你知道它)。我非常喜欢的另一种选择是:

我有一个每个州的成员函数,还有一个指向成员函数的指针,它指向当前的状态函数。当我想进入另一个状态时,我只是将该函数指针指向另一个状态函数。 (也许这不完全等同于状态模式,但在我的情况下它工作正常)。

我认为这两种方式几乎相同。

所以,我的问题是:

  1. 哪种解决方案更好(取决于什么)?
  2. 是否值得为每个状态声明一个类(只有一个函数)?我认为这是人为的。
  3. 表现怎么样?是不是创建了状态类的新对象(在状态模式的情况下)带来轻微的开销? (当然,州级课程不应该有成员,但无论如何都应该花费一些成本)

2 个答案:

答案 0 :(得分:1)

你并没有真正提到你的程序运行的限制因素,所以它特别强调一个实现的开销而不是另一个实现,所以我只是对代码发表评论可维护性。

我个人认为,除非你的状态机非常简单并且保持简单,否则每个状态声明一个类是更易于维护,可扩展的&可读。一个好的经验法则可能是,如果你不能查看你班级中的代码并将整个图片放在头脑中,那么你的课程可能做得太多了。您在为每个州声明一个类时所支付的小额开销可能非常值得您通过编写模块化代码(或最终维护它的任何其他人)获得的生产力提升。我遇到过太多的超级' uber'这些类本质上是一个很大的(非常难以维护的)状态机,可能最初只是一个简单的状态机,另外推荐。

' S'和' O' SOLID首字母缩略词(https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)的部分内容始终是要记住的好事。

答案 1 :(得分:0)

  1. 这取决于您是否需要访问对象的私有成员。如果没有,那么一个类外的实现会以较小的片段破坏你的代码,因此可能更好(但这不是客观的:这两个解决方案有利有弊)。

  2. 没有必要,但增加了一层抽象并放松了耦合。使用界面,您可以更改每个实现而不影响其他实现(例如,添加类字段...)

  3. 并不重要,分配新的空类或调用函数会产生相同的开销。