栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式(27)之备忘录模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式(27)之备忘录模式

一、游戏角色状态恢复需求

        游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态。

        1.1传统方式解决状态恢复问题

        传统方式解决具体类图如下:

        1.2 传统方式解决存在的问题
  1. 一个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象很多时,不利于管理,开销也很大 ;

  2. 传统的方式是简单地做备份,new出另外一个对象出来,再把需要备份的数据放到这个新对象,但这就暴露了对象内部的细节;

  3. 解决方案: => 备忘录模式;

二、备忘录模式

        备忘录(Memento)模式的定义:在不破坏封装行的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;该模式又叫快照模式。

        可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作;

        备忘录模式是一种对象行为型模式,其主要优点如下。

  1. 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  2. 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  3. 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
        2.1备忘录模式的实现原理类图

        备忘录模式的主要角色如下。

  1. 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
  2. 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  3. 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

 2.2备忘录模式解决游戏角色状态恢复

       具体代码实现如下:

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState(" 状态#1 攻击力 100 ");

        //保存了当前的状态
        caretaker.add(originator.saveStateMemento());

        originator.setState(" 状态#2 攻击力 80 ");

        caretaker.add(originator.saveStateMemento());

        originator.setState(" 状态#3 攻击力 50 ");
        caretaker.add(originator.saveStateMemento());


        System.out.println("当前的状态是 =" + originator.getState());

        //希望得到状态 1, 将 originator 恢复到状态1

        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("恢复到状态1 , 当前的状态是");
        System.out.println("当前的状态是 =" + originator.getState());


    }

}


public class Originator {

	private String state;//状态信息

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}
	
	//编写一个方法,可以保存一个状态对象 Memento
	//因此编写一个方法,返回 Memento
	public Memento saveStateMemento() {
		return new Memento(state);
	}
	
	//通过备忘录对象,恢复状态
	public void getStateFromMemento(Memento memento) {
		state = memento.getState();
	}
}

public class Memento {
    private String state;

    //构造器
    public Memento(String state) {
        super();
        this.state = state;
    }

    public String getState() {
        return state;
    }
	

}

public class Caretaker {

    //在List 集合中会有很多的备忘录对象
    private List mementoList = new ArrayList();

    public void add(Memento memento) {
        mementoList.add(memento);
    }

    //获取到第index个Originator 的 备忘录对象(即保存状态)
    public Memento get(int index) {
        return mementoList.get(index);
    }
}

        运行结果如下:

"C:Program Files (x86)Javajdk1.8.0_151binjava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2020.2.3libidea_rt.jar=51825:C:Program FilesJetBrainsIntelliJ IDEA 2020.2.3bin" -Dfile.encoding=GBK -classpath "D:yingzistudy源码B站设计模式课件源码笔记课件代码DesignPatternbin;C:Program Files (x86)Javajdk1.8.0_151jrelibcharsets.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibdeploy.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextaccess-bridge-32.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextcldrdata.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextdnsns.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextjaccess.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextjfxrt.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextlocaledata.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextnashorn.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextsunec.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextsunjce_provider.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextsunmscapi.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextsunpkcs11.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibextzipfs.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibjavaws.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibjce.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibjfr.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibjfxswt.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibjsse.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibmanagement-agent.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibplugin.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibresources.jar;C:Program Files (x86)Javajdk1.8.0_151jrelibrt.jar;D:yingzistudy源码B站设计模式课件源码笔记课件代码DesignPatternsrccomatguiguproxycglibasm-commons.jar;D:yingzistudy源码B站设计模式课件源码笔记课件代码DesignPatternsrccomatguiguproxycglibasm-tree.jar;D:yingzistudy源码B站设计模式课件源码笔记课件代码DesignPatternsrccomatguiguproxycglibasm.jar;D:yingzistudy源码B站设计模式课件源码笔记课件代码DesignPatternsrccomatguiguproxycglibcglib-2.2.jar" com.atguigu.memento.theory.Client
当前的状态是 = 状态#3 攻击力 50 
恢复到状态1 , 当前的状态是
当前的状态是 = 状态#1 攻击力 100 

Process finished with exit code 0
        2.3备忘录模式的注意事项和实现细节
  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态;
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节;
  3. 如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存, 这个需要注意;
  4. 适用的应用场景:1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理;
  5. 为了节约内存,备忘录模式可以和原型模式配合使用;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/643567.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号