Memento模式
該模式的出現,主要是為了讓用戶擁有“撤銷”的操作。好給用戶有個恢復先前狀態的權力。其主要思想就是將對象(假設其類型為:ClassA)的先前狀態記錄起來(當然自己得管理好)。在需要時,用此恢復。根據此思路,當然實現方法就多種多樣。下面參考設計模式資料中的c++代碼。(覺得此代碼設計還是挺有道理的。因為對Memento類來說,除了ClassA的對象外,其他類型的對象都不需要,且也不應該能訪問到。因此,在具體實現上,它用了友元的技術)。
該模式的出現,主要是為了讓用戶擁有“撤銷”的操作。好給用戶有個恢復先前狀態的權力。其主要思想就是將對象(假設其類型為:ClassA)的先前狀態記錄起來(當然自己得管理好)。在需要時,用此恢復。根據此思路,當然實現方法就多種多樣。下面參考設計模式資料中的c++代碼。(覺得此代碼設計還是挺有道理的。因為對Memento類來說,除了ClassA的對象外,其他類型的對象都不需要,且也不應該能訪問到。因此,在具體實現上,它用了友元的技術)。
typedef std::string State;
class COperationsMemento
{
//其實更強的,可以將該類設計成??梢跃S護一組狀態的。這樣,就可以支持
//任意恢復到先前的第N種狀態。就好似photoshop的層的那樣的撤銷。
//為說明思想,此暫時只維護一個狀態。
private:
State GetState(void)
{
return this->_sta;
}
void SetState(const State& state)
{
this->_sta = state;
}
// some code here
private:
State _sta;
};
class COperationSteps
{
public:
friend class COperationsMemento;
COperationSteps()
{
this->m_pMemento = NULL;
this->_sta = "normal";
}
COperationSteps(COperationsMemento* pMemento)
{
this->m_pMemento = pMemento;
this->_sta = "normal";
}
virtual ~COperationSteps()
{
if (m_pMemento != NULL)
{
delete m_pMemento;
m_pMemento = NULL;
}
}
//存儲狀態(即:保存狀態)
void SaveState(void)
{
if (m_pMemento == NULL)
{
m_pMemento = new COperationsMemento();
}
m_pMemento->SetState(this->_sta);
}
//恢復狀態
void RestoreState(COperationsMemento* pMemento = NULL)
{
if (pMemento != NULL)
{
this->_sta = pMemento->GetState();
}
else
{
this->_sta = m_pMemento->GetState();
}
}
private:
COperationsMemento* m_pMemento; //需要維護,因為該狀態,是自己私有的
State _sta;
};
class COperationsMemento
{
//其實更強的,可以將該類設計成??梢跃S護一組狀態的。這樣,就可以支持
//任意恢復到先前的第N種狀態。就好似photoshop的層的那樣的撤銷。
//為說明思想,此暫時只維護一個狀態。
private:
State GetState(void)
{
return this->_sta;
}
void SetState(const State& state)
{
this->_sta = state;
}
// some code here

private:
State _sta;
};
class COperationSteps
{
public:
friend class COperationsMemento;
COperationSteps()
{
this->m_pMemento = NULL;
this->_sta = "normal";
}
COperationSteps(COperationsMemento* pMemento)
{
this->m_pMemento = pMemento;
this->_sta = "normal";
}
virtual ~COperationSteps()
{
if (m_pMemento != NULL)
{
delete m_pMemento;
m_pMemento = NULL;
}
}
//存儲狀態(即:保存狀態)
void SaveState(void)
{
if (m_pMemento == NULL)
{
m_pMemento = new COperationsMemento();
}
m_pMemento->SetState(this->_sta);
}
//恢復狀態
void RestoreState(COperationsMemento* pMemento = NULL)
{
if (pMemento != NULL)
{
this->_sta = pMemento->GetState();
}
else
{
this->_sta = m_pMemento->GetState();
}
}
private:
COperationsMemento* m_pMemento; //需要維護,因為該狀態,是自己私有的
State _sta;
};