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

相关推荐

  • KEGG Module 数据库的原理是什么

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

    攻略 2021年12月2日
  • c语言中typedef和define的区别是什么

    技术c语言中typedef和define的区别是什么这篇文章主要介绍“c语言中typedef和define的区别是什么”,在日常操作中,相信很多人在c语言中typedef和define的区别是什么问题上存在疑惑,小编查阅

    攻略 2021年10月28日
  • 中国人民银行个人征信中心,怎样注册个人征信中心帐号

    技术中国人民银行个人征信中心,怎样注册个人征信中心帐号人民银行的个人信用账号不是申请的,是当你产生信用行为后人民银行系统根据你的身份证号码自动生成一个你自己的信用账号中国人民银行个人征信中心。 1. 打开中国人民银行征信

    生活 2021年10月29日
  • 感觉拼音,如果让你用拼音来写QQ空间的日志

    技术感觉拼音,如果让你用拼音来写QQ空间的日志估计真要用汉语拼音写日志感觉拼音,汉语拼音创始人,17世纪的法国(也算比利时)传教士金尼格也能看懂吧。
    中国自己的拼音第一人卢戆章却未必能看懂(他一直擅长拼音闽南语)
    方言是

    生活 2021年10月20日
  • 社戏人物形象分析,社戏中的人物形象分析和句子

    技术社戏人物形象分析,社戏中的人物形象分析和句子【文学常识】鲁迅社戏人物形象分析,原名周树人,字豫才。浙江绍兴人。伟大的无产阶级文学家、思想家和革命家。中国现代文学的奠基人。代表作有我国现代文学史上第一篇白话小说《狂人日

    生活 2021年10月22日
  • 喜怎么读,喜字下面加个心字念什么

    技术喜怎么读,喜字下面加个心字念什么憙 拼音:xǐ 部首:心,部外笔画:12,总笔画:16五笔86&98:FKUN 仓颉:GRP 笔顺编号:1212514312514544 四角号码:40336 UniCode:

    生活 2021年10月27日