какой шаблон проектирования использовать для различных процедур базового объекта - PullRequest
0 голосов
/ 20 января 2012

Я хотел бы написать библиотеку, которая может быть расширена. Вот примерная схема кода:

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-объект-процедуру для каждого объекта-объекта, который я создаю. Вместо этого я бы предпочел создать только один объект-процедуру для всех объектов, которым потребуется такой тип процедуры.

Или, другими словами, мне нужно место для хранения дополнительных переменных, необходимых для процедуры, связанной с объектом.

Обратите внимание, это не фактический код, это просто пример

Ответы [ 2 ]

0 голосов
/ 26 апреля 2012

Возможно, вы захотите сохранить состояние в самом объекте.

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

  ActionProc* pAP;
};

Затем пользователь может добавить состояния к объекту и получить их в своих экземплярах класса Action.(Возможно, существует лучший способ предоставить набор состояний).

0 голосов
/ 20 января 2012

Если вы хотите избежать добавления ActionProcs с поведением по умолчанию, вы можете указать на глобальный (без надежды на состояние) ActionProc с таким поведением. Вы можете перезаписать унаследованные классы и перезаписать, передав ActionProc в конструктор для поведения не по умолчанию.

Кстати: ваш код напоминает мост GOF шаблон проектирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...