在我最近参与的几个项目中,我几乎沉迷于以下编码模式:(我不确定是否有合适的名称,但无论如何......)
假设某个对象处于某个确定的状态,我们不想从外部更改此状态。这些更改可能意味着任何行为,可能调用任何算法,但事实是它们专注于更改某些对象的状态(成员状态、数据状态等)。
让我们将改变这些对象的一种离散方式称为 a Mutator
。(通常)Mutators
应用一次,并且它们具有一些内部方法,例如,它会立即引发更改对象的状态(实际上,它们是某种功能对象)。apply(Target& target, ...)
它们也可以很容易地被同化成链并一个一个地应用(Mutator m1, m2, ...
);它们也可以从一些基本BasicMutator
的 withvirtual void apply(...)
方法中派生出来。
我已经介绍了被调用的类InnerMutator
,ExplicitMutator
它们在访问方面有所不同——首先它们也可以改变对象的内部状态,并且应该被声明为友元(friend InnerMutator::access;
)。
在这些项目中,我的逻辑变成了以下方式:
- 准备可用的突变器,选择要应用的突变器
- 创建并将其设置
object
为某个确定的状态 foreach (mutator) mutator.apply(object);
现在的问题。
该方案运行良好,并且 (对我而言)似乎是一些非标准但有用的设计模式的示例。
让我感到不舒服的是那些
InnerMutator
东西。我不认为将 mutator 声明为每个可以更改状态的对象的朋友是一个好主意,我不想找到合适的替代方案。这种情况可以解决
Mutators
吗?或者您可以建议一些具有相同结果的替代模式吗?
谢谢。