c#版设计模式之备忘录模式

来源:互联网 发布:源码资本招聘 编辑:程序博客网 时间:2024/06/07 10:50

好几天没写博客了,前几天在网上看到一个设计模式叫做备忘录模式。觉得还是比较有趣,自己写了个模仿电脑备份的小例子。先看下备忘录模式的介绍吧
备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。

  定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
  涉及角色
  1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
  2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
  3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。
  备忘录模式的优点和缺点
  一、备忘录模式的优点
  1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,
  使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界
  2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需
  要的这些状态的版本。
  3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
  二、备忘录模式的缺点:
  1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
  2、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
  3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。  
下面就上一个我写的例子
1.备忘录类
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Recover.org.lxh{    //备忘录角色   public class Memento    {        private string status;        public string Status        {            get {                 return status;            }            set {                Console.WriteLine("系统处于:"+this.status);                status = value;            }        }       public Memento(string status)       {           this.status = status;       }    }}

2.发起人类
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Recover.org.lxh{   //发起人   public class WindowsSystem    {        private string status;        public string Status        {            get {                return status;             }            set {                 status = value;             }        }             public Memento createOtherSystem() {           return new Memento(status);       }       public void recoverSystem(Memento m)       {           this.status = m.Status;       }    }}

3.负责人(备忘录管理者)
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Recover.org.lxh{   //负责人(备忘录管理者)   public class UserComputer    {        private Memento memento;        public Memento recoverMemento()        {            // 恢复系统            return this.memento;        }        public void createMemento(Memento memento)        {             // 保存系统            this.memento = memento;        }    }}

4.测试类
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Recover.org.lxh;namespace Recover{    class Program    {        static void Main(string[] args)        {            WindowsSystem Winxp = new WindowsSystem(); // Winxp系统            UserComputer user = new UserComputer(); // 某一用户            Winxp.Status="好的状态"; // Winxp处于好的运行状态            user.createMemento(Winxp.createOtherSystem()); // 用户对系统进行备份,Winxp系统要产生备份文件            Winxp.Status="坏的状态"; // Winxp处于不好的运行状态            Winxp.recoverSystem(user.recoverMemento()); // 用户发恢复命令,系统进行恢复            Console.WriteLine("当前系统处于" + Winxp.Status);            Console.ReadKey();        }    }}