怎样深入理解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)

相关推荐

  • 美国服务器搭建SOCKS5代理的好处

    技术美国服务器搭建SOCKS5代理的好处随着跨境电商业务的火爆,很多用户需要利用SK5代理进行电商平台后台操作或者推广,那么利用美国服务器搭建SK5有哪些好处呢,下面就来简单介绍一下以下是使用美国SOCKS5代理的 4

    礼包 2021年12月14日
  • DNS访问原理是什么

    技术DNS访问原理是什么DNS访问原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前两天遇到一个面试的小伙伴,他说面试官和他聊得很投机,无意中谈

    攻略 2021年12月3日
  • Hive常用查询命令和使用方法

    技术Hive常用查询命令和使用方法这期内容当中小编将会给大家带来有关Hive常用查询命令和使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 将日志文件传到HDFS ```ba

    攻略 2021年11月11日
  • Spring事务知识点(总结)

    技术Spring事务知识点(总结) Spring事务知识点(总结)什么是事务
    答:既是把操作一次数据库的这个操作当成是一个事务,把这个行为抽象了。
    例如:查询一次user表的所有内容叫一次事务。事务的4

    礼包 2021年10月28日
  • 如何理解面向领域的微服务架构

    技术如何理解面向领域的微服务架构本篇内容主要讲解“如何理解面向领域的微服务架构”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解面向领域的微服务架构”吧!什么是微服务微服

    攻略 2021年10月23日
  • html和css基础知识有哪些

    技术html和css基础知识有哪些本篇内容主要讲解“html和css基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html和css基础知识有哪些”吧!Html是

    攻略 2021年12月10日