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

相关推荐

  • 追溯系统数据怎么做(大数据溯源)

    技术大数据中如何实现数据的高效追溯这篇文章给大家介绍大数据中如何实现数据的高效追溯,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何基于GES图数据库追溯服务的实现和优化。“一分钟,我要这个人的全部

    攻略 2021年12月23日
  • MYSQL中基础知识有哪些

    技术MYSQL中基础知识有哪些这篇文章主要介绍了MYSQL中基础知识有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、基础概念与基础命令1)基础概念

    攻略 2021年10月31日
  • 第十章(二) 模块补充 hashlib+log

    技术第十章(二) 模块补充 hashlib+log 第十章(二) 模块补充 hashlib+loghashlib模块
    加密:将明文数据通过一系列算法变成密文数据(目的就是为了数据的安全)加密算法:md系

    礼包 2021年11月30日
  • 消息队列架构设计思路(消息队列框架有哪些)

    技术消息队列Broker主从架构的设计方案是什么这篇文章将为大家详细讲解有关消息队列Broker主从架构的设计方案是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天

    2021年12月24日
  • 土字旁一个于怎么读,一个土字旁一个念什么字

    技术土字旁一个于怎么读,一个土字旁一个念什么字该字是土字旁一个于怎么读:埝。埝 niàn
    基本释义:田里或浅水里用来挡水的土埂:堤~。
    详细释义:
    《名词》:
    田里或浅水里用于挡水的土埂 。
    如:打埝
    淮北盐场交货

    生活 2021年10月26日
  • Python性能分析

    技术Python性能分析 Python性能分析性能分析装饰器
    # line profile
    import time
    from functools import wraps
    from line_profi

    礼包 2021年10月27日