蜗牛的家
男儿当自强
posts - 48,  comments - 21,  trackbacks - 0
意图:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态
UML图

适用:
必须保存一个对象在某一个时刻的状态,这样以后需要时它能恢复到先前的状态
如果一个用接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性
//test.h
#include <string>

typedef std::
string STATE;
//////////////////////////////////////////////////////////////////////////
class Memento;

class Originator
{
public:
    Originator(
const STATE& rState) : m_State(rState){}
    Originator()
{}
    
~Originator(){}

    Memento
* CreateMemento();
    
void SetMemento(Memento* pMemento);
    STATE GetState();
    
void SetState(const STATE& rState);
    
void RestoreState(Memento* pMemento);
    
void PrintState();

private:
    STATE m_State;
}
;

//所有函数都是私有,将Originator设置为友元用来访问
class Memento
{
private:
    friend 
class Originator;
    Memento(
const STATE& rState) : m_State(rState){}
    
//void SetState(const STATE& rState);
    STATE GetState();
    
    STATE m_State;
}
;

// test.cpp : Defines the entry point for the console application.
//

#include 
"stdafx.h"
#include 
<iostream>
#include 
"test.h"
//////////////////////////////////////////////////////////////////////////
STATE Originator::GetState()
{
    
return m_State;
}


void Originator::SetState(const STATE& rState)
{
    m_State 
= rState;
}


Memento
* Originator::CreateMemento()
{
    
return new Memento(m_State);
}


void Originator::RestoreState(Memento* pMemento)
{
    
//恢复状态
    if (NULL != pMemento)
    
{
        m_State 
= pMemento->GetState();
    }

}


void Originator::PrintState()
{
    std::cout 
<< "State="<<m_State<<"\n";
}


STATE Memento::GetState()
{
    
return m_State;
}


//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
     
// 创建一个原发器
    Originator* pOriginator = new Originator("old state");
    pOriginator
->PrintState();

    
// 创建一个备忘录存放这个原发器的状态
    Memento *pMemento = pOriginator->CreateMemento();
    
    
// 更改原发器的状态
    pOriginator->SetState("new state");
    pOriginator
->PrintState();

    
// 通过备忘录把原发器的状态还原到之前的状态
    pOriginator->RestoreState(pMemento);
    pOriginator
->PrintState();

    delete pOriginator;
    delete pMemento;

    system(
"pause");
    
return 0;
}

posted on 2008-08-23 01:42 黑色天使 阅读(366) 评论(0)  编辑 收藏 引用 所属分类: 设计模式

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜