zoukankan      html  css  js  c++  java
  • 设计模式漫谈之备忘录模式

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

    最近也是烦,欠了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();

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

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

  • 相关阅读:
    Array的应用
    事物的操作
    定义集合
    wxWidgets 在 Linux 下开发环境配置
    Emacs 中 GDB 的使用
    wxWidgets 在 Windows 下开发环境配置
    Ubuntu14.04终端主机名+用户名修改配色方案
    S5PV210之内外存学习
    Ubuntu14.04进行配置符号链接arm2009q3.tar.bz2
    Ubuntu14.041+VMware12.0NET方式网卡连接虚拟机联网问题解决方法
  • 原文地址:https://www.cnblogs.com/wang-charle/p/9357221.html
Copyright © 2011-2022 走看看