前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重温设计模式 --- 备忘录模式

重温设计模式 --- 备忘录模式

作者头像
Niuery Diary
发布2023-10-22 16:44:58
1690
发布2023-10-22 16:44:58
举报

引言

备忘录模式是一种行为型设计模式,它允许你捕获对象的内部状态,并在不暴露其实现细节的情况下将其保存在外部对象中,从而可以在以后的某个时间点将该对象恢复到先前的状态。

备忘录模式有以下几个主要角色:

  • Originator(原发器):是需要被保存状态的对象。它可以创建一个Memento对象来存储它的当前状态,并从Memento对象中恢复它之前的状态。
  • Memento(备忘录):存储Originator的内部状态。只有Originator可以访问和修改它的状态,外部对象不能访问和修改它。
  • Caretaker(管理者):负责保存和恢复Originator的状态。它保存了Originator的历史状态列表,并提供了一个接口来保存和恢复这些状态。

这些角色协同工作,使得Originator对象可以在不暴露其实现细节的情况下保存和恢复其状态。备忘录模式提供了一种灵活的方式,可以在多个时间点保存对象的状态,并可以在以后的某个时间点恢复到任何先前的状态。

下面使用C#实现一个简单备忘录模式:

定义原发器类

代码语言:javascript
复制
public  class  Originator
{
    private  string state;

    public  string State
    {
        get { return state; }
        set 
        { 
            state = value; 
            Console.WriteLine("State set to: " + state); 
        }
    }

    public Memento SaveState()
    {
        return new Memento(state);
    }

    public void RestoreState(Memento memento)
    {
        state = memento.State;
        Console.WriteLine("State restored to: " + state);
    }
}

定义备忘录

代码语言:javascript
复制
public  class  Memento
{
    private  string state;

    public Memento(string stateToSave)
    {
        state = stateToSave;
    }

    public  string State
    {
        get { return state; }
    }
}

定义管理者

代码语言:javascript
复制
public  class  Caretaker
{
    private List<Memento> mementoList = new List<Memento>();

    public void SaveState(Memento state)
    {
        mementoList.Add(state);
    }

    public Memento RestoreState(int stateNumber)
    {
        return mementoList[stateNumber];
    }
}

调用代码:

代码语言:javascript
复制
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();

originator.State = "State 1";
originator.State = "State 2";
caretaker.SaveState(originator.SaveState());

originator.State = "State 3";
caretaker.SaveState(originator.SaveState());

originator.State = "State 4";
Console.WriteLine("Current state: " + originator.State);

// 恢复到之前的状态
originator.RestoreState(caretaker.RestoreState(1));
Console.WriteLine("Restored state: " + originator.State);

输出结果:

代码语言:javascript
复制
State set to: State 1
State set to: State 2
State set to: State 3
State set to: State 4
Current state: State 4
State restored to: State 3
Restored state: State 3

在这个例子中,Originator是一个保存状态的对象,它的状态被保存到Memento对象中。Caretaker保存了Originator的历史状态列表,并提供了保存和恢复这些状态的方法。当需要恢复之前的状态时,Caretaker通过调用RestoreState方法来获取Memento对象,并将其传递给OriginatorRestoreState方法,从而将Originator恢复到之前的状态。

结论

备忘录模式的优点是它可以在不暴露对象实现细节的情况下保存和恢复对象的状态。它还允许对象在多个时间点保存它的状态,并恢复到之前的任何时间点。缺点是如果保存的状态非常大,它可能会占用大量的内存。此外,备忘录模式会增加代码的复杂性和开销。

在实际应用中,备忘录模式通常与其他模式一起使用,例如命令模式和状态模式,以实现更复杂的行为。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Niuery Diary 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
    • 定义原发器类
      • 定义备忘录
        • 定义管理者
        • 结论
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档