设计模式实战学习笔记六):备忘录、访问者模式

(十七)备忘录模式:

备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

从结构中看出备忘录模式包含3个角色:

1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。

2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。

3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。

(转自 https://www.cnblogs.com/BeyondAnyTime/archive/2012/08/05/2623667.html

备忘录模式代码实现:

public class MementoDM : MonoBehaviour
{
    private void Start()
    {
        //    #region 输出结果为 state1 state2 state1
        //    Originator originator1 = new Originator();
        //    originator1.SetState("state1");
        //    originator1.ShowState();
        //    Memento m1 = originator1.CreateMemento();

        //    originator1.SetState("state2");
        //    originator1.ShowState();

        //    originator1.SetMemento(m1);
        //    originator1.ShowState();
        //    #endregion


        #region 输出结果为 state1 state2 state3 state2 state3
        Caretaker caretaker1 = new Caretaker();

        Originator originator1 = new Originator();
        originator1.SetState("state1");
        originator1.ShowState();
        caretaker1.AddMemento("v1", originator1.CreateMemento());

        originator1.SetState("state2");
        originator1.ShowState();
        caretaker1.AddMemento("v2", originator1.CreateMemento());

        originator1.SetState("state3");
        originator1.ShowState();
        caretaker1.AddMemento("v3", originator1.CreateMemento());

        originator1.SetMemento(caretaker1.GetMemento("v2"));
        originator1.ShowState();

        originator1.SetMemento(caretaker1.GetMemento("v3"));
        originator1.ShowState();
        #endregion
    }
}

//发起人类
public class Originator
{
    private string mState;
    public void SetState(string state)
    {
        mState = state;
    }
    public void ShowState()
    {
        Debug.Log("Originator state :" + mState);
    }
    //保存备忘录
    public Memento CreateMemento()
    {
        Memento memento = new Memento();
        memento.SetState(mState);
        return memento;
    }
    //恢复备忘录
    public void SetMemento(Memento memento)
    {
        SetState(memento.GetState());
    }
}

//备忘录类
public class Memento
{
    private string mState;
    public void SetState(string state)
    {
        mState = state;
    }
    public string GetState()
    {
        return mState;
    }
}

//管理者类
public class Caretaker
{
    Dictionary<string, Meme
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值