首页 > 其他分享 >备忘录模式

备忘录模式

时间:2022-12-13 10:11:08浏览次数:39  
标签:int def 模式 备忘录 Memento vit public memento

游戏角色状态恢复问题

 

 

 

传统方案解决游戏角色恢复问题

 

 

传统解决方案的问题分析

 

 

备忘录模式基本介绍

 

 

备忘录模式的原理类图

 

 

 

 

代码实现

package com.sky.memento.theory;

// 原始对象
public class Originator {

    private String state; // 状态信息

    // 提供set get 方法
    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    // 编写一个方法,可以保存一个状态对象 Memento
    public Memento saveStateMemento(){
        return new Memento(state);
    }

    // 通过备忘录对象,恢复状态
    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }
}
package com.sky.memento.theory;

// 备忘录
public class Memento {

    private String state;

    // 通过构造器进行state的注入
    public Memento(String state){
        this.state = state;
    }

    public String getState() {
        return state;
    }
}
package com.sky.memento.theory;

import java.util.ArrayList;

// 备忘录容器
public class CareTaker {

    // 创建一个备忘录集合,来保存备忘录
    private ArrayList<Memento> mementoList = new ArrayList<>();

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

    public Memento get(int index){
        return mementoList.get(index);
    }
}
package com.sky.memento.theory;

// 客户端
public class Client {

    public static void main(String[] args) {
        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());

    }
}

当前的状态是 = 状态#3 攻击力 50
恢复到状态1,当前状态是
当前的状态是 = 状态#1 攻击力 100

游戏角色恢复状态的实例

 

 

思路分析及类图

 

 

代码实现

package com.sky.memento.game;

// 游戏角色 属性类
public class GameRole {

    private int vit; // 攻击力
    private int def; // 防御力

    // 创建备忘录Memento,即根据当前的状态得到Memento
    public Memento createMemento(){
        return new Memento(vit,def);
    }

    // 从备忘录对象,恢复初始状态
    public void recoveryGameRoleFromMemento(Memento memento){
        this.vit = memento.getVit();
        this.def = memento.getDef();
    }

    // 显示当前游戏的角色状态
    public void display(){
        System.out.println("当前角色的攻击力:"+ this.vit + " 防御力:"+ this.def);
    }

    // 提供get set 方法供外部进行修改
    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}
package com.sky.memento.game;

// 备忘录
public class Memento {

    // 攻击力
    private int vit;
    // 防御力
    private int def;

    // 通过构造器,进行初值注入
    public Memento(int vit, int def) {
        this.vit = vit;
        this.def = def;
    }

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}
package com.sky.memento.game;

// 守护者对象,保存游戏角色的状态
public class Caretaker {

    // 如果只保存一次状态
    private Memento memento;
    // 如果对一个对象需要保存多次状态
//    private ArrayList<Memento> mementos;
//    // 对多个游戏角色保存多个状态
//    private HashMap<String, ArrayList<Memento>> rolesMementos;


    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}
package com.sky.memento.game;


import com.sky.memento.theory.CareTaker;

public class Client {

    public static void main(String[] args) {
        // 创建游戏角色
        GameRole gameRole = new GameRole();
        gameRole.setVit(100);
        gameRole.setDef(100);

        System.out.println("和boss大战前的状态");
        gameRole.display();

        // 把当前状态保存到 caretaker 中
        Caretaker careTaker = new Caretaker();
        careTaker.setMemento(gameRole.createMemento());

        System.out.println("和boss 大战~~~");
        gameRole.setVit(50);
        gameRole.setDef(50);
        gameRole.display();

        System.out.println("大战后,使用备忘录对象恢复到战前");

        gameRole.recoveryGameRoleFromMemento(careTaker.getMemento());
        gameRole.display();

    }
}

和boss大战前的状态
当前角色的攻击力:100 防御力:100
和boss 大战~~~
当前角色的攻击力:50 防御力:50
大战后,使用备忘录对象恢复到战前
当前角色的攻击力:100 防御力:100

备忘录模式的注意事项和细节

 

 

 

标签:int,def,模式,备忘录,Memento,vit,public,memento
From: https://www.cnblogs.com/dongyaotou/p/16977814.html

相关文章

  • 设计模式-策略模式
    设计模式-策略模式  代码写作过程中,设计模式是对某些固定场景代码写作的总结和优化,最常见的设计模式,除了单例模式外,还有工厂模式和策略模式。 工厂模式是一种创建型......
  • MongoDB - 数据模型的设计模式
    简介官方文章的地址是BuildingwithPatterns:ASummary,其中汇总了12种设计模式及使用场景。上述的图表列举了12种设计模式及应用场景,主要是以下这些:近似值模式......
  • 工厂方法模式在开发中的应用
    事件是这样的,我的每个页面都有一些属性,我拿其中一个属性PageTitle为例,它是一个ArrayList它是页面标题导航的意思,就是说它的标题用来存储一些标题导航,比如,产品列表页,它的Page......
  • java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
    大家好,我是雄雄,欢迎你的到来~前言需求是这样的,当用户关注公司服务(公众)号时,就自动注册成为了会员,且通过小程序设置提醒,然后后台可以通过服务(公众)号给用户推送模板信息。实现......
  • 浅谈单例模式的几种实现
     单例模式(来自菜鸟教程)单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一......
  • JAVA 单例模式 饿汉和懒汉
    单例模式特点:①单例类只能有一个实例②私有构造方法,不允许通过其他类创建单例类的实例③提供静态get方法返回单实例饿汉式:类加载的时候就创建实例懒汉式:类加载时不创建......
  • 微软新商业模式:想用Windows 10?掏钱!
    Windows10是微软的标志性产品,随着时代的变化,Windows授权营收不断下降。无奈之下,微软只好寻找新办法从客户手中“榨取”更多的金钱。ZDNET最近刊文对微软的策略变化进行......
  • iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
    键值编码KVC我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方便,因为你可以利用字符串的方式去动态控制一个对象。其实由于ObjC的语言特性,你根部不必进行......
  • 串的匹配模式
     //串的模式匹配//1.朴素的模式匹配算法intIndex1(charS[],charP[],intpos){//查找并返回串P在主串S中从pos位置开始的位置,否则返回-1inti,j,slen,pl......
  • 优维低代码:Theme & Mode 页面主题和模式
    优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维......