話說 memento.備忘模式

來源:互聯網
上載者:User

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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.