设计模式—备忘录模式

前言

备忘录模式与命令模式优点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘录模式是保存的发起人的状态(状态对应数据库结构,如属性)

备忘录模式介绍

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撤销操作的实现,数据库中事务操作。

posted @ 2015-11-13 11:46  细数青春  阅读(153)  评论(0编辑  收藏  举报