仅当对象处于特定状态时,操作才有效

时间:2013-10-31 11:14:18

标签: c++ design-patterns

我的应用程序中有很多类型的对象。所有都可以具有以下状态:UpToDate,OutOfDate,NotComputed。仅当对象的状态为UpTodate时,才允许对象的所有操作。如果对象的状态为NotComputed或OutOfDate,则唯一允许的操作是Compute和ChangeComputationParams。在gui中,我想仅在允许的情况下才显示对象上的操作。所以我有Operation Validatiors对象,为每个返回对象操作的对象是否应该显示在gui上。问题是,每当我向某个对象添加新操作时,我需要转到其OperationValidator类,并在那里添加新函数。一定是更好的方式。例如:

class Object1OperationValidator
{
    Object1OperationValidator(Object1& object1)
    {
       mObject1 = object1;
    }

    bool CanDoCompute()
    {
       return true;
    }

    bool CanDoChangeComputationParams()
    {
       return true;
    }

    bool CanDoOperation1()
    {
       if(mObject1.State() != UpToDate )
          return false;
       else
          return true;        
    }

    .....
    bool CanDoOperationN()
    {
        if(mObject1.State() != UpToDate )
          return false;
       else
          return true;
    }

 }

1 个答案:

答案 0 :(得分:0)

您可以使用模板化的类来实现验证函数:

template <class T>
void CheckBaseOperations
{
public:
    CheckBaseOperations(T * obj)
        :inst(obj)
    {}

    bool CheckOperation()
    {
        //...
        return inst->State() != X;
    }
public:
    T * inst;
};
//----------------------------------------------------------------------
//for generic types
template <class T>
void CheckOperations : public CheckBaseOperations<T>
{
public:
    CheckOperations(T * obj)
        :CheckBaseOperations<T>(obj)
    {}
};

//----------------------------------------------------------------------
template <> //specific validation for a certain type.
void CheckOperations <YourType> : public CheckBaseOperations<YourType>
{
public:
    CheckOperations(YourType * obj)
        :CheckBaseOperations<YourType>(obj)
    {}

    bool CheckOperationForYourType()
    {
        //...
        return inst->State() != X;
    }
};

如果您需要

,也可以CheckOperations专门针对特定类型