C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

模式设计c#--行为型--menento

名称 Memento
结构 o_menento.bmp
意图 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
适用性
  • 必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
  • 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。


namespace  Memento_DesignPattern
{
    
using  System;

    
class  Originator 
    
{
        
private   double  manufacturer = 0 ;
        
private   double  distributor  =   0 ;
        
private   double  retailer  =   0 ;

        
public   void  MakeSale( double  purchasePrice)
        
{
            
//  We assume sales are divided equally amount the three
            manufacturer  +=  purchasePrice  *  . 40 ;
            distributor 
+=  purchasePrice  * . 3 ;
            retailer 
+=  purchasePrice  * . 3 ;
            
//  Note: to avoid rounding errors for real money handling 
            
//  apps, we should be using decimal integers
            
//  (but hey, this is just a demo!)
        }


        
public  Memento CreateMemento()
        
{
            
return  ( new  Memento(manufacturer, distributor, retailer));            
        }

        
        
public   void  SetMemento(Memento m)
        
{
            manufacturer 
=  m.A;
            distributor 
=  m.B;
            retailer 
=  m.C;
        }
        
    }


    
class  Memento 
    
{
        
private   double  iA;
        
private   double  iB;
        
private   double  iC;

        
public  Memento( double  a,  double  b,  double  c)
        
{
            iA 
=  a;
            iB 
=  b;
            iC 
=  c;
        }


        
public   double  A 
        
{
            
get  
            
{
                
return  iA;
            }

        }


        
public   double  B 
        
{
            
get  
            
{
                
return  iB;
            }

        }


        
public   double  C 
        
{
            
get  
            
{
                
return  iC;
            }

        }

    }


    
class  caretaker 
    
{
        
    }


        
///   <summary>
    
///     Summary description for Client.
    
///   </summary>

     public   class  Client
    
{
        
public   static   int  Main( string [] args)
        
{              
            Originator o 
=   new  Originator();
            
            
//  Assume that during the course of running an application 
            
//  we we set various data in the originator
            o.MakeSale( 45.0 );
            o.MakeSale(
60.0 );

            
//  Now we wish to record the state of the object
            Memento m  =  o.CreateMemento();

            
//  We make further changes to the object
            o.MakeSale( 60.0 );
            o.MakeSale(
10.0 );
            o.MakeSale(
320.0 );

            
//  Then we decide ot change our minds, and revert to the saved state (and lose the changes since then)
            o.SetMemento(m);

            
return   0 ;
        }

    }

}


//  Memento pattern -- Real World example  


using  System;

namespace  DoFactory.GangOfFour.Memento.RealWorld
{

  
//  MainApp test application 

  
class  MainApp
  
{
    
static   void  Main()
    
{
      SalesProspect s 
=   new  SalesProspect();
      s.Name 
=   " Noel van Halen " ;
      s.Phone 
=   " (412) 256-0990 " ;
      s.Budget 
=   25000.0 ;

      
//  Store internal state 
      ProspectMemory m  =   new  ProspectMemory();
      m.Memento 
=  s.SaveMemento();

      
//  Continue changing originator 
      s.Name  =   " Leo Welch " ;
      s.Phone 
=   " (310) 209-7111 " ;
      s.Budget 
=   1000000.0 ;

      
//  Restore saved state 
      s.RestoreMemento(m.Memento);

      
//  Wait for user 
      Console.Read();
    }

  }


  
//  "Originator" 

  
class  SalesProspect
  
{
    
private   string  name;
    
private   string  phone;
    
private   double  budget;

    
//  Properties 
     public   string  Name
    
{
      
get return  name; }
      
set
      

        name 
=  value; 
        Console.WriteLine(
" Name:  "   +  name);
      }

    }


    
public   string  Phone
    
{
      
get return  phone; }
      
set
      

        phone 
=  value; 
        Console.WriteLine(
" Phone:  "   +  phone);
      }

    }


    
public   double  Budget
    
{
      
get return  budget; }
      
set
      

        budget 
=  value; 
        Console.WriteLine(
" Budget:  "   +  budget);
      }

    }


    
public  Memento SaveMemento()
    
{
      Console.WriteLine(
" \nSaving state --\n " );
      
return   new  Memento(name, phone, budget);
    }


    
public   void  RestoreMemento(Memento memento)
    
{
      Console.WriteLine(
" \nRestoring state --\n " );
      
this .Name  =  memento.Name;
      
this .Phone  =  memento.Phone;
      
this .Budget  =  memento.Budget;
    }

  }


  
//  "Memento" 

  
class  Memento
  
{
    
private   string  name;
    
private   string  phone;
    
private   double  budget;

    
//  Constructor 
     public  Memento( string  name,  string  phone,  double  budget)
    
{
      
this .name  =  name;
      
this .phone  =  phone;
      
this .budget  =  budget;
    }


    
//  Properties 
     public   string  Name
    
{
      
get return  name; }
      
set { name  =  value; }
    }


    
public   string  Phone
    
{
      
get return  phone; }
      
set { phone  =  value; }
    }


    
public   double  Budget
    
{
      
get return  budget; }
      
set { budget  =  value; }
    }

  }


  
//  "Caretaker" 

  
class  ProspectMemory
  
{
    
private  Memento memento;

    
//  Property 
     public  Memento Memento
    
{
      
set { memento  =  value; }
      
get return  memento; }
    }

  }

}

 
Output
Name:   Noel van Halen
Phone:  (412) 256-0990
Budget: 25000

Saving state --

Name:   Leo Welch
Phone:  (310) 209-7111
Budget: 1000000

Restoring state --

Name:   Noel van Halen
Phone:  (412) 256-0990
Budget: 25000

posted on 2006-01-03 16:12 梦在天涯 阅读(757) 评论(1)  编辑 收藏 引用 所属分类: Design pattern

评论

# re: 模式设计c#--行为型--menento 2006-04-25 09:23 梦在天涯

备忘录模式还好理解拉!哈哈  回复  更多评论   


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


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1796271
  • 排名 - 5

最新评论

阅读排行榜