设计模式—备忘录模式
前言
备忘录模式与命令模式优点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘录模式是保存的发起人的状态(状态对应数据库结构,如属性)
备忘录模式介绍
1)定义
备忘录模式就是对某个类的状态进行保存,等需要恢复的时候从备忘录中进行恢复,如备份电话簿,备份操作系统,备份数据库
具体定义:在不破坏封装的前提下,捕获一个对象的状态,并在该对象之外保存这个状态,这样以后就可以吧该对象恢复到原来状态
2)实际例子
游戏中怪物打boss,开始时血值100,开启外挂,打不过时恢复至原来状态重新打
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication1 7 { 8 /// <summary> 9 /// 发起者 10 /// </summary> 11 public class Monster 12 { 13 private int _blood; 14 public int Blood 15 { 16 get { return _blood; } 17 set { _blood = value; } 18 } 19 20 //创建备忘数据,将当前要保存的信息导入并实例化备忘录 21 public MonsterBlood CreateMosterBlood() 22 { 23 return new MonsterBlood(this.Blood); 24 } 25 26 //回复备忘数据,将Memento导入并将相关数据恢复 27 public void ResetMonsterBlood(MonsterBlood monster) 28 { 29 this.Blood = monster.Blood; 30 } 31 32 public void Show() 33 { 34 Console.WriteLine("当前血值:{0}", this.Blood); 35 } 36 } 37 38 /// <summary> 39 /// 备忘录角色 40 /// </summary> 41 public class MonsterBlood 42 { 43 public int Blood { set; get; } 44 45 //保存血值 46 public MonsterBlood(int blood) 47 { 48 this.Blood = blood; 49 } 50 } 51 52 /// <summary> 53 /// 管理者角色 54 /// </summary> 55 public class Caretaker2 56 { 57 public MonsterBlood MonsterBlood { set; get; } 58 59 } 60 }
调用方法:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Microsoft.VisualStudio.TestTools.UnitTesting; 6 7 namespace ConsoleApplication1 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //------------------------------------------------- 14 Monster monster = new Monster(); 15 monster.Blood = 100; 16 monster.Show(); 17 18 Caretaker2 caretaker = new Caretaker2(); 19 caretaker.MonsterBlood = monster.CreateMosterBlood(); 20 21 Console.WriteLine("战斗开始"); 22 23 monster.Blood = 20; 24 monster.Show(); 25 26 monster.ResetMonsterBlood(caretaker.MonsterBlood); 27 monster.Show(); 28 //---------------------------------------------------- 29 } 30 } 31 }
运行结果:
3)备忘录模式介绍
备忘录中有三种角色:
发起人:记录当前时刻的内部状态,负责创建和恢复备份数据
备忘录:负责存储发起人对象的内部状态,在进行恢复是提供给发起人需要的状态
管理者:负责保存备忘录对象
4)需求变更
当需要保存多个还原点是,需要保存多个备忘录对象
5)备忘录模式分析
优点:如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。
备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。
缺点:在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。
6)备忘录模式使用场景
如果系统需要提供回滚操作时,使用备忘录模式非常合适。例如文本编辑器的Ctrl+Z撤销操作的实现,数据库中事务操作。