话说 memento.备忘模式

me men  to 汉译为纪念品 纪念物。看到它你能想到过去的样子。

这里实际上是 保存一个对象的状态以便将来能恢复到这种状态。 毫无疑问 这将需要耗费内存,如果你要保存一个对象的多个状态,或者是多个对象的一个状态。当然你可以用文件来保存。不过你得考虑怎么样让这一切方便。

class  CommemorableObj

{

private:

int  m_i;

public:

    void GetMemento( Memento  &m)

  {

      m.i=m_i;

 }

 void SetMemento(Memento &m )const

{

m_i= m.i;

}

};

class Memento

{

public:

int i;

};

//

CommemorableObj  co;

Memento m;

co.GetMemento(m);

//.chang co  attribute..

///...

co.SetMemento( m);// restore co

 

//......上面试一些简单的实例代码。关键是要说明 其实memento 就是一种冗余。

关于这种模式,我想到了这么几个东西 :一是原型模式,另外一个就是拷贝构造函数,

这里我只说拷贝构造函数,它分为深拷贝和浅拷贝。我想memento应该是一种深拷贝。

我不明白使用这种模式 和 利用深拷贝来保存一个对象值得留念的状态有什么不同。。

。希望有明白的人可以给我留言。

 

另外,我想知道的是有没有 万能的 能用来保存所有类的对象的值得留念的状态,以便以后能够恢复到这种值得留念的状态。请注意以上代码,commemorableobj , memento 有相同的数据成员。如果是万能的话,那就是要求可以不必知道被保存的有多少个成员。

我想 内存复制是一个不错的注意。实现代码如下:

#include <iostream>
using namespace std;

class AbstractMemento
{
public:
 bool virtual SetMemento( void *p,int bytesize)=0;

 bool virtual GetMemento( void *p )const=0;

protected:
private:
};

class A
{
public:
 A()
 {
  m_a = 10;
 }
 int m_a;
 virtual void fna()
 {
  cout<<"A::m_a"<<m_a<<endl;
 
 }

};
class B
{
public:
 int m_b1;
 int m_b2;
 B()
 {
  m_b1=100;
 }
 virtual void fnb()
 {
  cout<<"B::m_b1"<<m_b1<<endl; 
 }
};
class C
{
public:
 virtual void fnb()
 {
  
 }
};
class CMemento:public AbstractMemento
{
public:
 CMemento()
 {
  m_p = NULL;
 }
 bool virtual SetMemento(void *p,int bytesize)
 {
  if ( m_p != NULL )
  {
   return false;
  }
  m_p = (void *)new char[bytesize];
  ::memcpy( m_p, p ,bytesize );
  m_bs = bytesize;
  return true;
 }
 bool virtual GetMemento( void *p )const
 {
  if ( m_p == NULL)
  {
   return false;
  }
  memcpy( p ,m_p , m_bs );
  delete[]m_p; //»á²»»áÓÐÎÊÌâ
  //m_p = (void *)NULL; //error
  CMemento();
  return true;
 }
protected:
 void *m_p;
 int m_bs;
};

int main(int argc, char* argv[])
{
 CMemento m;
 A a;
 m.SetMemento( (void*)&a ,sizeof(a) );
 a.fna();
 a.m_a = 20;
 a.fna();
 m.GetMemento( (void*)&a );
 a.fna();

 CMemento m2;
 B b;
 m2.SetMemento( (void*)&b ,sizeof(b) );
 b.fnb();
 b.m_b1 = 20;
 b.fnb();
 m2.GetMemento( (void*)&b );
 b.fnb();
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值