设计模式-行为型-备忘录模式

备忘录模式



前言

我们日常用的git ,svn,回收站等等,可以提供一种代码文件撤回的功能,就是使用的备忘录模式,通过另外的一个位置来存储历史版本文件,可以在一定情况下进行数据回滚。


一、备忘录模式(快照、Snapshot、Memento)

在不破坏封装的前提下,保存对象的状态,在需要时进行恢复,例如:备份、后悔机制,草稿箱,回收站。

二、角色

  1. 发起人角色(Originator):负责创建备忘录,记录自身需要保存的状态,具备状态回滚功能。
  2. 备忘录角色(Memento):用于存储Originator的内部状态,且可以防止Originator以外的对象进行访问。
  3. 备忘录管理员角色(Caretaker):负责存储,提供管理memento,无法Memento的内容进行操作和访问。

三、应用场景

  • 需要保存历史快照的场景
  • 希望在对象之外保存状态,且除了自己,其他类对象无法访问状态保存的具体内容。

四、代码实现

1.备忘录发起人

说明:可以被备忘录进行存储的对象,内置备忘录创建方法,以及从备忘录回去对象的方法。

	/// <summary>
    /// 备忘录发起人
    /// </summary>
    public class Originator
    {
        private string state;
        public string getState()
        {
            return this.state;
        }
        public void setState(string state)
        {
            this.state = state;
        }
        public Memento createMemento() {
            Console.WriteLine("创建一个备忘录");
            return new Memento(this.state);
        }
        public void restorememento(Memento memento) {
            Console.WriteLine("从备忘录恢复数据");
            this.setState(memento.getState());
        }

    }

2.备忘录角色

说明:备忘录的对象,存取方法

 	/// <summary>
    /// 备忘录角色
    /// </summary>
    public class Memento {
        private string state;
        public Memento(string state) {
            this.state = state;
        }
        public string getState() {
            return this.state;
        }
        public void setState(string state) {
            this.state = state;
        }
    }

3.备忘录管理者角色

说明:管理备忘录

	/// <summary>
    /// 备忘录管理者角色
    /// </summary>
    public class Caretaker {
        private Memento Memento;
        public Memento GetMemento (){
            return this.Memento;
        }
        public void storeMemento(Memento memento) {
            this.Memento = memento;
        }
    }

4.客户端调用方式

说明:调用流程(发起人------备忘录管理员-----存储到备忘录----------回滚备忘录)

	/// <summary>
    /// 备忘录管理者角色
    /// </summary>
 	public class storeMementoClient {
        public void Clienter() {
            Console.WriteLine("创建发起人角色");
            Originator originator = new Originator();
            Console.WriteLine("创建备忘录管理员角色");
            Caretaker caretaker = new Caretaker();
            Console.WriteLine("存储发起人的备忘录");
            caretaker.storeMemento(originator.createMemento());
            Console.WriteLine("从备忘录管理员中获取备忘录进行回滚");
            originator.restorememento(caretaker.GetMemento());
        }
    }

5.Run Result

创建发起人角色
创建备忘录管理员角色
存储发起人的备忘录
创建一个备忘录
从备忘录管理员中获取备忘录进行回滚
从备忘录恢复数据

总结

优点:

  • 简化发起人实体类的职责,隔离章台存储与获取,实现了信息的封装,客户端无须关心状态的保存细节。
  • 提供状态回滚功能。

缺点:

  • 消耗资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenny@chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值