为可能更改其内部属性的类选择设计模式

时间:2010-04-30 02:29:39

标签: c++ design-patterns oop

我有一个拥有任意状态的类,它的定义如下:

class AbstractFoo
{
};

template <class StatePolicy>
class Foo : public StatePolicy, public AbstractFoo
{
};

州政策仅包含代表州的受保护属性 状态可能对于多个行为是相同的,并且可以在运行时替换它们 所有Foo对象都具有相同的接口来抽象状态本身并允许在容器中存储Foo对象 我想找到最简洁,最易于维护的表达方式。

编辑:
以下是关于我的问题的更多信息:
Foo是一个表示某个硬件的状态和行为的类,可以通过物理方式或通过UI(并且有多个UI)进行更改。
我还有四个问题:
1)信号/插槽机制会做什么?
2)是否可以绑定来自Foo中插槽的每个发出信号,以指向Foo,就像它是成员类一样?
3)我应该使用访客而将Foo视为访问类吗? 4)为什么StatePolicy设计不好?

以下是更新的API:

class AbstractFoo
{
public:
  virtual void /*or boost::signal*/ notify() = 0; // Updates the UI.
  virtual void /*or boost::signal*/ updateState() = 0 // Updates the state
};

2 个答案:

答案 0 :(得分:4)

我完全不了解你的情况,但是我的注意事项是:如果你做了AbstractStatePolicy怎么办?例如:

class AbstractStatePolicy
{
};

class Foo
{
    AbstractStatePolicy *state_policy;

public:
    Foo(AbstractStatePolicy *state_policy)
        : state_policy(state_policy)
    {
    }
};

这样,您可以使用Foo动态设置StatePolicy,而不是使用StatePolicyFoo静态定义为模板。

如果您不喜欢每次创建Foo时都必须指定state_policy,请考虑使用默认值或编写工厂来实例化{{1}}。

答案 1 :(得分:0)

我认为你所拥有的是一种非常明智的方法。您应该有一个纯虚拟基类来描述您的实现实际可以执行的操作,然后您可以使用您需要的任何状态创建从基类继承的具体类。然后,您可以通过为该基类定义的任何接口与状态进行交互。现在,如果你有可以在运行时改变的任意动态属性,那么实现它的一个好方法是使用地图或字典类型;您可以从字符串(属性名称)映射到字符串(表示属性值),或者如果您想要更多类型安全性,则可以从字符串(属性名称)映射到boost::any的实例。