设计模式漫谈之备忘录模式

最近很长时间没写博客了,其实这个博客写过一半,中间有事耽搁了,就没继续。主要是给别人做了一个小系统,及维护码云上的代码库。同居的日子也占了我很多时间。

最近也是烦,欠了7W,各种烦事。所以可想写个博客静静心。

在面向对象中关注的焦点是对象空间,对象与对象的联系还是通过保存引用(相当于路),来走到其空间中。

在对象中是有空间的,空间里放的肯定是数据或者是命令。

备忘录就是把A对象的空间数据,备份到B对象空间一份。如果A对象与B对象是一个类型的对象,未免浪费B对象的空间,因为我是个性保存数据的,不一定是保存A的所有数据。

所以最好把B对象设计成一个专一保存A要保存数据的宿主对象,由于在内存中B对象是要随时用的,那也需要把B对象存起来,存在哪里?创造一个宿主对象C即可。

说的太多,直接看例子,我解释。

//空间对象

class GameRole
{
//对象中的数据
private int vit;
public int Vitality
{
get { return vit; }
set { vit = value; }
}

private int atk;
public int Attack
{
get { return atk; }
set { atk = value; }
}

private int def;
public int Defense
{
get { return def; }
set { def = value; }
}

//对象中的命令
public void StateDisplay()
{
Console.WriteLine("角色当前状态:");
Console.WriteLine("体力:{0}", this.vit);
Console.WriteLine("攻击力:{0}", this.atk);
Console.WriteLine("防御力:{0}", this.def);
Console.WriteLine("");
}

public RoleStateMemento SaveState()
{

//要保存的数据,放入数据宿主中
return (new RoleStateMemento(vit, atk, def));
}

//从数据宿主中还原对象
public void RecoveryState(RoleStateMemento memento)
{
this.vit = memento.Vitality;
this.atk = memento.Attack;
this.def = memento.Defense;
}

public void GetInitState()
{
this.vit = 100;
this.atk = 100;
this.def = 100;
}

public void Fight()
{
this.vit = 0;
this.atk = 0;
this.def = 0;
}
}

//数据宿主对象
class RoleStateMemento
{

//其内存的数据
private int vit;
private int atk;
private int def;

public RoleStateMemento(int vit, int atk, int def)
{
this.vit = vit;
this.atk = atk;
this.def = def;
}

public int Vitality
{
get { return vit; }
set { vit = value; }
}

public int Attack
{
get { return atk; }
set { atk = value; }
}

public int Defense
{
get { return def; }
set { def = value; }
}
}

//数据宿主的宿主对象

class RoleStateCaretaker
{

//存的是数据宿主
private RoleStateMemento memento;

public RoleStateMemento Memento
{
get { return memento; }
set { memento = value; }
}
}

//创建对象
GameRole lixiaoyao = new GameRole();
lixiaoyao.GetInitState();
lixiaoyao.StateDisplay();

//把对象的数据存在数据对象宿主中,然后再把数据对象宿主放在另一个对象中(即数据对象的宿主的宿主对象)
RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
stateAdmin.Memento = lixiaoyao.SaveState();

lixiaoyao.Fight();
lixiaoyao.StateDisplay();

//从数据宿主对象中恢复数据。
lixiaoyao.RecoveryState(stateAdmin.Memento);

lixiaoyao.StateDisplay();

总结,思想的东西是不分语言的,只要有思维的人类,其思想是互通的。编程语言的核心就是思想。编程语言为了让人类使用,必须适应人类的思维。

今天到此为止,以后多多学习,我女朋友说我除了写代码,其他方面就是弱智,哎,人总要有一个爱好的。否则生活好无趣!

原文地址:https://www.cnblogs.com/wang-charle/p/9357221.html

时间: 2024-11-06 09:40:46

设计模式漫谈之备忘录模式的相关文章

IOS设计模式之四(备忘录模式,命令模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么错误,请与我联系谢谢. 备忘录(Memento)模式 备忘录模式快照对象的内部状态并将其保存到外部.换句话说,它将状态保存到某处,过会你可以不破坏封装的情况下恢复对象的状态,也就是说原来对象中的私有数据仍然是私有的. 如何使用备忘录模式 在ViewController.m中增加

设计模式入门之备忘录模式Memento

//备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就可以将该对象恢复到原先保存的状态 //实例:测试两种方案,两种方案在第一阶段的过程是相同的,第二阶段是不同的 //实例代码 //备忘录对象的窄接口 public interface FlowAMockMemento { //空的,所谓窄接口,即只是一个标识作用,它的持有者不可以调用任何它的方法 } //测试流程类 public class FlowAMock { private

设计模式之:备忘录模式

前言: 这个国庆,回家不想学习,于是下了个三国志11,玩了好几天,终于从一个只有一个城池,5.6个武将,一两万士兵的刘备,发展成占有半壁江山了,灭了曹操,袁绍等,那在玩游戏的时候,我肯定不能连续几十个小时都不退出游戏,或者说不关机,那我每次肯定都需要保存游戏进度才能下次继续玩,那这就用上我这次要说的备忘录模式了,每次讲记录保存在存档里,下次进入游戏又可以接着上一次继续玩了~ 定义(源于GoF<设计模式>): 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可

《java设计模式》之备忘录模式

备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态.备忘录模式常常与命令模式和迭代子模式一同使用. 备忘录模式的结构 备忘录模式的结构图如下所示 备忘录模式所涉及的角色有三个:备忘录(Memento)角色.发起人(Originator)角

PHP设计模式漫谈之迭代器模式

原文出处:blogspot 今天<PHP设计模式漫谈>系列的主角是迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代.迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代. 在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口.只要有可能,我们可以给迭代器传送一个引用,代替将来可能发生变化的具体或

[设计模式-行为型]备忘录模式(Memento)

一句话 让某个对象可以取到之前的某个状态值. 概括 解析 MEMENTO-同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦. 备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态. 实例 这个实例就以状态值

设计模式14:备忘录模式

备忘录模式适用于功能比较复杂的,但需要维护或者记录属性的类,对象可以根据备忘录回滚到上一状态. 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 客户不与备忘录类耦合,与备忘录管理类耦合. uml: 代码: public class Memento { private String state = null; public Memento(String state) { this.state = state;

设计模式学习之备忘录模式(Memento,行为型模式)(19)

假如我们已经记录一个人的个人信息,但是发现信息写错了,然后我先备份下再去修改,结果发现原来的信息是正确的,于是我就看备份的个人信息还原到初始的状态,下面我们用代码去实现 class Program { static void Main(string[] args) { Person person = new Person("张三", "男", 25); //保存内部状态 Person personBackup = new Person(); personBackup

2018/12/10《大话设计模式》【备忘录模式】

1:为什么要使用备忘录模式? - 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. - 在平常的需要备忘/快照的模式中,经常需要客户端来进行操作来进行复杂操作保存等逻辑. - 哎~,这个越说越晦涩,就这么说吧,不用修改基类,你想保存这个对象之前的状态,就是用这个就好了 - 就类似备忘录一样 2:备忘录模式的应用场景? - 在<大话涉及模式中也指出> - 适合功能比较复杂的历史功能这样的类,或者简单存储的属性. 3:备忘录