用于不同基础对象过程的设计模式

时间:2012-01-20 13:01:24

标签: c++ design-patterns

我想写一个可以扩展的库。这是一个粗略的代码大纲:

class Object
{
    ActionProc* pAP;
};    
class Sphere : public Object;
class Point : public Object;

class ActionProc
{
    virtual Action( Object* ) = 0;         
};

class ActionProcMove : public ActionProc
{
    bool m_bCanMove;     

    virtual Action( Object* obj )
    {
        if( m_bCanMove )
        {
             //do some moving stuff
        }
    }; 
};

此库的用户可能会像这样扩展它: (再次,只是一个代码大纲)

class ActionProcSize : public ActionProc
{
    bool m_bCanSize;     

    virtual Action( Object* obj )
    {
        if( m_bCanSize)
        {
             //do some sizing stuff
        }
    }; 
};

虽然这样可行,但这意味着我必须为我创建的每个对象对象创建一个make-procedure-object。相反,我更愿意为需要这种类型的过程的所有对象创建一个过程对象。

或者换句话说,我需要一个地方来存储链接到对象的过程所需的额外变量。

请注意,这不是实际代码,只是一个示例

2 个答案:

答案 0 :(得分:0)

如果您想避免使用默认行为添加ActionProcs,您可以指向具有此行为的全局(希望无状态)ActionProc。您可以通过在构造函数中传递ActionProc来为非默认行为覆盖继承的类和覆盖。

BTW:您的代码类似于GOF的bridge设计模式。

答案 1 :(得分:0)

您可能需要考虑将状态存储在Object本身中。

class Object {
  std::map<UINT32 id, bool variable> mBoolStates;
  std::map<UINT32 id, UINT32 variable> mUINTStates;

  ActionProc* pAP;
};

然后,用户可以向对象添加想要的状态,并在其Action类实例中检索它们。 (可能有更好的方法来提供状态集合。)