怎样深入理解Java设计模式的备忘录模式

技术怎样深入理解Java设计模式的备忘录模式本篇文章为大家展示了怎样深入理解Java设计模式的备忘录模式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、什么是备忘录模式定义:在

本文向您展示了如何深入理解Java设计模式的memory模式。内容简洁易懂,一定会让你大放异彩。希望通过这篇文章的详细介绍,你能有所收获。

00-1010定义:在不破坏闭包的情况下捕获对象的内部状态,并将该状态保存在对象外部。这样,对象可以在以后恢复到其原始保存状态。

该模式用于保存对象的当前状态,以后可以再次恢复到该状态。实现纪念品模式的方式需要保证保存的对象状态不会被外部的对象访问,

目的是保护这些对象的保存状态的完整性,并防止内部实现被暴露。

一、什么是备忘录模式

怎样深入理解Java设计模式的备忘录模式

涉及角色:

1.发起方:负责创建备忘录备忘录,记录其当前时刻的内部状态,并使用备忘录恢复内部状态。发起者可以根据需要决定Memento存储的内部状态。

2.纪念品:负责存储发起方对象的内部状态,可以防止发起方以外的其他对象访问备忘录。备忘录有两个界面:看管人只能看到备忘录的狭窄界面,他只能将备忘录传递给其他对象。发起人可以看到备忘录的宽界面,允许它访问所有需要的数据,以返回到以前的状态。

3.管理员(经理):负责备忘录备忘录,不能访问或操作备忘录的内容。

00-1010 1.需要保存和恢复数据的相关状态场景。

2.提供一个可以回滚的操作。

3.memento模式用于数据库连接的事务管理。

二、备忘录模式的结构

优点:

1.有时,某些发起人对象的内部信息必须存储在发起人对象之外,但必须由发起人对象本身读取。此时,使用纪念品图案可以将赞助商复杂的内部信息与其他物体屏蔽开来,从而妥善维护包装边界。

2.这个模型简化了发起的人类。发起人不再需要管理和保存其内部状态的版本,客户可以自行管理这些状态的版本。

3.当发起人角色的状态改变时,该状态可能无效。此时,临时存储的备忘录可用于恢复状态。

缺点:

1.如果发起者角色的状态需要完全存储在memo对象中,那么memo对象在资源消耗方面将是昂贵的。

2.当负责人的角色存储备忘录时,负责人可能不知道这种状态会占用多少存储空间,因此不可能提醒用户某项操作是否昂贵。

3.当发起人角色的状态发生变化时,本协议可能无效。如果状态改变成功率不高,最好采用“If”协议模式。

三、备忘录模式的使用场景

实例:备份电话簿

联系人-需要备份的数据是状态数据,没有操作。

publicsealedclassContactPerson

{

//名称

publicstringName { get设置;}

//电话号码

publicstringMobileNumber { get设置;}

}发起者-相当于[发起者角色]发起者。

public sealed class mobilebacokoriginator

{

//发起方需要保存的内部状态

privatestcontactperson _ person list;

公共列表联系人联系人列表

{

得到

{

n

bsp;       return this._personList;
        }
        set
        {
            this._personList = value;
        }
    }
    //初始化需要备份的电话名单
    public MobileBackOriginator(List<ContactPerson> personList)
    {
        if (personList != null)
        {
            this._personList = personList;
        }
        else
        {
            throw new ArgumentNullException("参数不能为空!");
        }
    }
    // 创建备忘录对象实例,将当期要保存的联系人列表保存到备忘录对象中
    public ContactPersonMemento CreateMemento()
    {
        return new ContactPersonMemento(new List<ContactPerson>(this._personList));
    }
    // 将备忘录中的数据备份还原到联系人列表中
    public void RestoreMemento(ContactPersonMemento memento)
    {
        this.ContactPersonList = memento.ContactPersonListBack;
    }
    public void Show()
    {
        Console.WriteLine("联系人列表中共有{0}个人,他们是:", ContactPersonList.Count);
        foreach (ContactPerson p in ContactPersonList)
        {
            Console.WriteLine("姓名: {0} 号码: {1}", p.Name, p.MobileNumber);
        }
    }
}

备忘录对象,用于保存状态数据,保存的是当时对象具体状态数据--相当于【备忘录角色】Memeto

public sealed class ContactPersonMemento
{
    // 保存发起人创建的电话名单数据,就是所谓的状态
    public List<ContactPerson> ContactPersonListBack { get; private set; }
    public ContactPersonMemento(List<ContactPerson> personList)
    {
        ContactPersonListBack = personList;
    }
}

管理角色,它可以管理【备忘录】对象,如果是保存多个【备忘录】对象,当然可以对保存的对象进行增、删等管理处理---相当于【管理者角色】Caretaker

public sealed class MementoManager
{
    //如果想保存多个【备忘录】对象,可以通过字典或者堆栈来保存,堆栈对象可以反映保存对象的先后顺序
    //比如:public Dictionary<string, ContactPersonMemento> ContactPersonMementoDictionary { get; set; }
    public ContactPersonMemento ContactPersonMemento { get; set; }
}

客户端代码

class Program
{
    static void Main(string[] args)
    {
        List<ContactPerson> persons = new List<ContactPerson>()
            {
                new ContactPerson() { Name="黄飞鸿", MobileNumber = "13533332222"},
                new ContactPerson() { Name="方世玉", MobileNumber = "13966554433"},
                new ContactPerson() { Name="洪熙官", MobileNumber = "13198765544"}
            };
        //手机名单发起人
        MobileBackOriginator mobileOriginator = new MobileBackOriginator(persons);
        mobileOriginator.Show();
        // 创建备忘录并保存备忘录对象
        MementoManager manager = new MementoManager();
        manager.ContactPersonMemento = mobileOriginator.CreateMemento();
        // 更改发起人联系人列表
        Console.WriteLine("----移除最后一个联系人--------");
        mobileOriginator.ContactPersonList.RemoveAt(2);
        mobileOriginator.Show();
        // 恢复到原始状态
        Console.WriteLine("-------恢复联系人列表------");
        mobileOriginator.RestoreMemento(manager.ContactPersonMemento);
        mobileOriginator.Show();
        Console.Read();
    }
}

上述内容就是怎样深入理解Java设计模式的备忘录模式,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/71910.html

(0)

相关推荐

  • rocketmq可视化界面讲解(rocket可视化报表)

    技术如何进行ROCKET的数据可视化如何进行ROCKET的数据可视化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。图形化操作,布局灵活,所见

    攻略 2021年12月24日
  • 30的倍数有哪些,30以内5的倍数有哪些

    技术30的倍数有哪些,30以内5的倍数有哪些30以内3的倍数3 6 9 12 15 18 21 24 27 30 30以内5的倍数5 10 15 20 25 3030以内3和5的公倍数15 30倍数 ①一个整数能够被另

    生活 2021年10月26日
  • 如何用3个步骤实现响应式Web设计

    技术如何用3个步骤实现响应式Web设计本篇文章给大家分享的是有关如何用3个步骤实现响应式Web设计,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。写在前面的话

    攻略 2021年11月17日
  • SpringBoot Https 修改状态码

    技术SpringBoot Https 修改状态码 SpringBoot Https 修改状态码@Beanpublic ServletWebServerFactory servletContainer()

    礼包 2021年12月15日
  • oracle归档日志流式分析(oracle执行语句分析)

    技术Oracle查询脚本的示例分析这篇文章将为大家详细讲解有关Oracle查询脚本的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 --查询回滚段信

    攻略 2021年12月20日
  • KEGG Module 数据库的原理是什么

    技术KEGG Module 数据库的原理是什么KEGG Module 数据库的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具有相同功能的基因

    攻略 2021年12月2日