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