(48)C#设计模式—— 备忘录模式(Memento Pattern)

引言

今天介绍的备忘录模式与命令模式有些相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘录模式保存的是发起人的状态(状态对应的数据结构,如属性)。

定义

从字面意思就可以明白,备忘录模式就是对某个类的状态进行保存,等到需要回复的时候,可以从备忘录中进行恢复。生活中这样的例子经常看到,如备忘电话通讯录,备份数据库等。

备忘录模式的具体定义:在不破坏封装的前提下,不会一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以把该对象恢复到原先的状态。

结构

涉及到的角色有:

  • 发起人角色:记录当前时刻的内部状态,负责创建和恢复备忘录数据。
  • 备忘录角色:负责存储发起人对象的内部状态,在进行恢复时提供给发起然需要的状态
  • 管理者角色:负责保存备忘录对象

实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _39MementoPatternDemo
{
    
    //联系人
    public class ContactPerson
    {
    
        public string Name {
     get; set; }
        public string  MobileNum {
     get; set; }
    }
    //发起人
    public class MobileOwner
    {
    
        //发起人需要保存的内部状态
        public List<ContactPerson> ContactPersons {
     get; set; }
        public MobileOwner(List<ContactPerson> persons)
        {
    
            ContactPersons = persons;
        }
        //创建备忘录,将当前要保存的联系然列表导入备忘录中
        public ContactMemento Create()
        {
    
            //这里应该传递深拷贝,new List 方式传递的是浅拷贝
            //因为ContactPerson类中都是string类型,所以这里new List方式对ContactPerson对象执行的深拷贝
            //如果ContactPerson包括非string的引用类型就会有问题,所以这里也应该用序列化传递深拷贝
            return new ContactMemento(new List<ContactPerson>(this.ContactPersons));
        }
        //将备忘录中的数据备份导入到联系人列表中
        public void RestoreMemento(ContactMemento memento)
        {
    
            //下面这种方式是错误的,因为这样传递的是引用
            //则删除一次可以恢复,但恢复之后再删除的话就恢复不了
            //所以应该传递contactPersonBack的深拷贝,深拷贝可以使用序列化来完成
            this.ContactPersons = memento.contactPersonBack;
        }
        public void Show()
        {
    
            Console.WriteLine("联系人列表中有{0}个人,他们是:", ContactPersons.Count);
            foreach (ContactPerson p in ContactPersons)
            {
    
                Console.WriteLine("姓名: {0} 号码为: {1}", p.Name, p.MobileNum);
            }
        }
    }
    //备忘录
    public class ContactMemento
    {
    
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值