【发布时间】:2010-06-28 17:40:42
【问题描述】:
在我最近参与的几个项目中,我几乎沉迷于以下编码模式:(我不确定是否有合适的名称,但无论如何......)
假设某个对象处于某个确定的状态,我们不想从外部更改此状态。这些更改可能意味着任何行为,可能调用任何算法,但事实是它们专注于更改某些对象的状态(成员状态、数据状态等...)。
我们将更改这些对象的一种离散方式称为Mutator。 Mutators 被应用一次(通常),它们有一些内部方法,如 apply(Target& target, ...),它会立即引发更改对象的状态 (实际上,它们是某种函数式对象)。
它们也可以很容易地融入链并一个接一个地应用(Mutator m1, m2, ...);它们也可以通过virtual void apply(...) 方法从一些基本的BasicMutator 派生而来。
我已经介绍了名为InnerMutator 和ExplicitMutator 的类,它们在访问方面有所不同——它们中的第一个也可以更改对象的内部状态,并且应该声明为朋友(@ 987654329@).
在这些项目中,我的逻辑变成了以下方式:
- 准备可用的修改器,选择要应用的修改器
- 创建
object并将其设置为某个确定的状态 foreach (mutator) mutator.apply(object);
现在是问题。
这个方案运行良好,并且 (对我来说) 似乎是一些非标准但有用的设计的样本 图案。
让我感到不舒服的是
InnerMutator的东西。我不 认为将 mutator 声明为朋友 每个对象的状态可能是 改变是个好主意,我不想 找到合适的替代品。这种情况可以用
Mutators解决吗? 建议一些替代模式 结果一样吗?
谢谢。
【问题讨论】:
-
如果你能给我们一些具体的例子,这可能有助于确定你的方法是否值得稍微奇怪的做事方式。