备忘录模式实例1

摘要:
5.此时,我们将使用备忘录模式定义:捕获对象的内部状态并保存对象外部的状态,而不破坏封装。

1、以游戏的场景为例,我们来讲解这个备忘录模式,一游戏角色有生命力、攻击力、防御力等数据,在打Boss后如果效果不理想可以让游戏恢复到决斗前的状态。

2、玩家类

备忘录模式实例1第1张备忘录模式实例1第2张
 1 class GameRole
 2     { 
 3     //生命力
 4         public int Vitality { set; get; }
 5     //攻击力
 6         public int Attack { set; get; }
 7     //防御力
 8         public int Defense { set; get; }
 9     //状态显示
10         public void StateDisplay()
11         {
12             Console.WriteLine("显示当前状态:");
13             Console.WriteLine("体力:{0}",this.Vitality);
14             Console.WriteLine("攻击力:{0}",this.Attack);
15             Console.WriteLine("防御力: {0}",this.Defense);
16         }
17     //获得初始状态
18         public void GetInitState()
19         {
20             this.Vitality = 100;
21             this.Attack = 100;
22             this.Defense = 100;
23         }
24     //战斗
25         public void Fight()
26         {
27             this.Vitality = 0;
28             this.Attack = 0;
29             this.Defense = 0;
30         }
31     }
View Code

3、客户端类

备忘录模式实例1第1张备忘录模式实例1第4张
 1 static void Main(string[] args)
 2         {
 3             //大战boss前
 4             Console.WriteLine("#############_战boss前_#################");
 5             GameRole gr = new GameRole();
 6             gr.GetInitState();
 7             gr.StateDisplay();
 8 
 9             //通过新的实例来保存进度
10             GameRole backup = new GameRole();
11             backup.Vitality = gr.Vitality;
12             backup.Defense = gr.Defense;
13             backup.Attack = gr.Attack;
14 
15             //战boss后
16             Console.WriteLine("#############_战boss后_#################");
17             gr.Fight();
18             gr.StateDisplay();
19 
20             //恢复之前的状态
21             Console.WriteLine("#############_恢复之前的状态_#################");
22             gr.Vitality = backup.Vitality;
23             gr.Defense = backup.Defense;
24             gr.Attack = backup.Attack;
25             gr.StateDisplay();
26 
27             Console.Read();
28 
29 
30         }
View Code

4、这样写问题主要在于客户端的调用,这样把整个游戏角色的细节暴露给了客户端,你的客户端的职责过大,我们希望可以把这些游戏角色的存取状态细节封装起来,而且最好是封装在外部的类当中,以体现职责分离。

5、到这里我们就要用到备忘模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

6、现在我们来改造这个代码,首先要有一个存储状态的类

备忘录模式实例1第1张备忘录模式实例1第6张
 1 class RoleStateMemento
 2     {
 3         public int Vitality { set; get; }
 4         public int Attack { set; get; }
 5         public int Defense { set; get; }
 6         public RoleStateMemento(int vit, int att, int def)
 7         {
 8             this.Vitality = vit;
 9             this.Attack = att;
10             this.Defense = def;
11 
12         }
13     }
View Code

7、改造玩家类

备忘录模式实例1第1张备忘录模式实例1第8张
 1  class GameRole
 2     { 
 3     //生命力
 4         public int Vitality { set; get; }
 5     //攻击力
 6         public int Attack { set; get; }
 7     //防御力
 8         public int Defense { set; get; }
 9 
10     //保存状态
11         public RoleStateMemento SaveState()
12         {
13             return new RoleStateMemento(Vitality, Attack, Defense);
14         }
15 
16     //恢复状态
17         public void RecoveryState(RoleStateMemento rs)
18         {
19             this.Vitality = rs.Vitality;
20             this.Attack = rs.Attack;
21             this.Defense = rs.Defense;
22         }
23     //状态显示
24         public void StateDisplay()
25         {
26             Console.WriteLine("显示当前状态:");
27             Console.WriteLine("体力:{0}",this.Vitality);
28             Console.WriteLine("攻击力:{0}",this.Attack);
29             Console.WriteLine("防御力: {0}",this.Defense);
30         }
31     //获得初始状态
32         public void GetInitState()
33         {
34             this.Vitality = 100;
35             this.Attack = 100;
36             this.Defense = 100;
37         }
38     //战斗
39         public void Fight()
40         {
41             this.Vitality = 0;
42             this.Attack = 0;
43             this.Defense = 0;
44         }
45     }
View Code

8、还要有一个管理角色状态的类

1 class RoleStateCaretaker
2     {
3         public RoleStateMemento rs;
4     }

9、客户端代码

备忘录模式实例1第1张备忘录模式实例1第10张
 1 static void Main(string[] args)
 2         {
 3             //大战boss前
 4             Console.WriteLine("#############_战boss前_#################");
 5             GameRole gr = new GameRole();
 6             gr.GetInitState();
 7             gr.StateDisplay();
 8 
 9             //保存进度
10             RoleStateCaretaker rc = new RoleStateCaretaker();
11             rc.roleState = gr.SaveState();
12 
13 
14             //战boss后
15             Console.WriteLine("#############_战boss后_#################");
16             gr.Fight();
17             gr.StateDisplay();
18 
19             //恢复之前的状态
20             Console.WriteLine("#############_恢复之前的状态_#################");
21             gr.RecoveryState(rc.roleState);
22             gr.StateDisplay();
23 
24             Console.Read();
25 
26 
27         }
View Code

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇7种流行PHP集成开发工具(IDE)的比较ruby之基础语法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

TCL基本语法2

TCL基本语法21、format和scan两个基本的函数,和C语言中的sprintf和scanf的作用基本相同。format将不同类型的数据压缩在字符串中,scan将字符串中的数据提取出来。setnameJacksetage100setworker[format"%sis%dyearsold"$name$age]puts$workerscan$worker"...

如何在jenkins上新建一个项目及其简单配置

单击[新建]进入选择页面,您可以在此页面上配置项目(包括拉取源代码、修改连续构建时间以及在打包和部署之前修改配置文件)3。在General中,您可以设置要构建的版本,如下图5所示。在源代码管理模块中,您可以设置源代码地址(我们公司常用的Git)6。如果是自动构建,您可以将自动构建时间(即构建频率)设置为7。以下是构建中的一些设置。您可以使用shell修改源代...

fiddler抓包+雷电模拟器 完成手机app抓包的配置

找到系统应用,点击设置,点击无线网络WLAN—˃左键常按点击已连接网络—˃修改网络鼠标左键长按在桌面找到下面这个文件之后双击打开上面证书弄完之后。可以说本机已经安装过证书了,如果你能在模拟器上找到这个证书就不用将这个证书再拉入模拟器了在模拟器中打开系统应用—˃设置—˃安全—˃从SD卡安装。找到FiddlerRoot.cer文件,按提示导入即可,注意在此过程需...

Win10阻止电脑关机时弹出正在关闭应用的方法及恢复

当计算机上安装了Windows 10时,当我们在未完成所有运行程序的情况下关闭计算机时,将弹出n个应用程序正在关闭并关闭的提示。第一步是创建一个自动关闭应用程序并将其添加到注册表的注册表文件。这可以解决在Windows 10系统计算机关闭时弹出提示关闭n个应用程序并关闭的问题。...

vue 数组push元素 视图没更新

Vue包含一组用于观察数组的变异方法,因此它们也会触发视图更新。这些方法如下:push()pop()shift()unshift()split()sort()reverse()问题描述:在tap列下,向每个选项卡添加一行数据,可以一直添加默认行。切换到选项卡1时,阵列已成功添加,但视图未更改。来回切换后手动更新分析:由于JavaScript限制,Vue无法检...

怎样能使winform窗体的大小固定住,不能调整其大小

Form1.TopMost=真/假10.将窗体设置为部分透明窗体1.透明键。它接受颜色值。当表单中的颜色与设置的颜色一致时,系统将这些颜色的区域设置为透明。事件1.激活和停用:窗体的活动和非活动状态,即鼠标的焦点和非焦点状态;2.在关闭过程中();您可以取消以关闭此事件。...