java 之 备忘录模式(大话设计模式)

备忘录模式,给笔者的感觉,我们在实际开发中很少用到,至少笔者是没用到过。一般在游戏后台开发应该会经常用到吧!当然这只是

笔者的推断。先看下类图

大话设计模式-类图

再继续看下Demo吧

/**
 * 需要保存的进度信息类
 */
public class RoleSateMemento{

    private Integer atk;

    private Integer vit;

    private Integer attack;

    public RoleSateMemento(Integer atk, Integer vit, Integer attack) {
        super();
        this.atk = atk;
        this.vit = vit;
        this.attack = attack;
    }

    public Integer getAtk() {
        return atk;
    }

    public void setAtk(Integer atk) {
        this.atk = atk;
    }

    public Integer getVit() {
        return vit;
    }

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

    public Integer getAttack() {
        return attack;
    }

    public void setAttack(Integer attack) {
        this.attack = attack;
    }
}
/**
 * 存储进度类
 */
public class RolerStateCaretaker {

    private RoleSateMemento roleSateMemento;

    public RoleSateMemento getRoleSateMemento() {
        return roleSateMemento;
    }

    public void setRoleSateMemento(RoleSateMemento roleSateMemento) {
        this.roleSateMemento = roleSateMemento;
    }
}
/**
 * 角色类
 */
public class RolerInfo {

    private Integer atk;

    private Integer vit;

    private Integer attack;

    public RolerInfo(Integer atk, Integer vit, Integer attack) {
        super();
        this.atk = atk;
        this.vit = vit;
        this.attack = attack;
    }

    public static RolerInfo initRoler() {
        return new RolerInfo(100, 100, 100);
    }

    public void showState() {
        System.out.println("当前血量: " + vit);
        System.out.println("当前攻击力: " + atk);
        System.out.println("当前防御力: " + attack);
    }

    public RoleSateMemento saveRolerInfo() {
        return new RoleSateMemento(atk, vit, attack);
    }

    public void restoreMenmento(RoleSateMemento roleSateMemento) {
        this.vit = roleSateMemento.getVit();
        this.atk = roleSateMemento.getAtk();
        this.attack = roleSateMemento.getAttack();
    }

    public Integer getAtk() {
        return atk;
    }

    public void setAtk(Integer atk) {
        this.atk = atk;
    }

    public Integer getVit() {
        return vit;
    }

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

    public Integer getAttack() {
        return attack;
    }

    public void setAttack(Integer attack) {
        this.attack = attack;
    }
}
/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) {
        RolerInfo role = RolerInfo.initRoler();
        System.out.println("----------大战BOSS之前----------");
        role.showState();

        //保持进度
        RolerStateCaretaker caretaker = new RolerStateCaretaker();
        caretaker.setRoleSateMemento(role.saveRolerInfo());

        //大战BOSS
        role.setAtk(0);
        role.setAttack(0);
        role.setVit(0);
        System.out.println("----------大战BOSS----------");
        role.showState();

        //恢复存档
        role.restoreMenmento(caretaker.getRoleSateMemento());
        System.out.println("----------恢复----------");
        role.showState();

    }
}

运行结果

----------大战BOSS之前----------
当前血量: 100
当前攻击力: 100
当前防御力: 100
----------大战BOSS----------
当前血量: 0
当前攻击力: 0
当前防御力: 0
----------恢复----------
当前血量: 100
当前攻击力: 100
当前防御力: 100

简单看下记忆类和负责保存记忆的类,其实就是几个属性,然后还有set,get方法,并不复杂,主要的逻辑还是在角色类里。笔者之前看大话设计模式时

一直误解为什么角色类里面的属性和记忆类里面的属性相同,而不让角色类继承记忆类呢? 后来仔细想下,原因是,角色里面有很多属性不需要保存。打个比方

角色的性别不会因为大战BOSS之后就变性,所以性别并不需要保存,所以这里没有用继承,记忆只是负责保存需要保存的属性。

以上是笔者对备忘录模式的理解,希望能帮助学习的小伙伴。另外笔者强烈推荐学习的小伙伴多看看大话设计模式,然后领悟其精髓,自己在手动写一次代码。

时间: 2024-10-11 03:22:50

java 之 备忘录模式(大话设计模式)的相关文章

十二、行为型模式之中介者、访问者、备忘录-----《大话设计模式》

一.中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互:中介者负责控制和协调一组对象之间的交互,充当一个中介以使组中的对象不再相互显式引用. 优点:Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和mediator:由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,

备忘录模式——HeadFirst设计模式学习笔记

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.可以将该对象恢复到原先保存的状态 Java中可以使用序列化机制保存状态 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据. 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态. 管理角色:对备忘录进行管理,保存和提供备忘录. 特点: 被存储的状态放在外面,不和关键对象放在一起 保持了关键对象的封装,提供实现恢复的能力 缺点: 资源与时间的消耗 举

java 之 观察者模式(大话设计模式)

观察者模式,笔者以前做校验订单时用过一次,只是不知道有这个模式,当时使用观察者省略了N多if else 在笔者看来观察者模式比较试用于一个对象状态改变后,很多个对象也要根据这个状态做相应的动作,当然观察者模式只是给大家开了一扇门,更希望的是灵活运用,而不是拘泥于细节, 我们可以从中汲取到把实现相同接口的类来放到集合里,然后便利集合调取公共方法去完成相应的工作,先看下类图 大话设计模式-类图 基于类图笔者写了如下的简单的实例. /** * 通知者抽象接口 */ public interface I

简单工程模式 -- 大话设计模式

在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<大话设计模式>来祭奠那逝去的…… 简单工厂的作用是实例化对象,不需要客户了解这个对象属于哪个具体子类.简单工厂实例化的类具有相同的接口或者基类,在子类相对固定或者不需要扩展的时候,可以使用简单工厂.如数据库生产工厂就可以使用简单工厂来实现. 1.简单的计算器实现 输入两个数和运算符,实现两数相加或者两数相减. 首先我们定义一个运算类,包含两个属性:数字A和数字B,还有一个获取结果的虚方法GetResult方

【大话设计模式】设计模式系统学习大合集

转载请注明出处:http://blog.csdn.net/column/details/designpatternbylmb.html 为了方便各位网友学习以及方便自己复习之用,将设计模式的系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章. 大话设计模式-工厂模式 大话设计模式-单例模式 大话设计模式-原型模式 深复制VS浅复制(MemberwiseClone方法介绍) 大话设计模式-代理模式 大话设计模式-中介者模式 大话设计模式-策略模式 大话设计模式-装饰模式 大

&lt;六&gt;读&lt;&lt;大话设计模式&gt;&gt;之原型模式

原型模式也是很简单的一种模式,对于java来说已经有相应的接口了(Cloneable).关于原型模式<<大话设计模式>>是以投放简历作为例子讲解的,即我要投放很多简历,其实每个简历都一样,所以只要我写好一份,其他的复制就行了,其实就是今天讲的原型模式,就是把要复制的类对象的属性复制到另外一个对象上(其实不是复制而是对象的引用改变). 原型模型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 浅复制VS深复制 关于克隆有两个概念 浅复制:就是只复制值类型的字段,不能

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

大话设计模式—备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃. 大话设计模式中程杰老师给出的定义是,备忘录模式:在不破坏封装性的前提下,捕获一个对象的内

Java设计模式(十) 备忘录模式 状态模式

(十九)备忘录模式 备忘录模式目的是保存一个对象的某个状态,在适当的时候恢复这个对象. class Memento{ private String value; public Memento(String value){ this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } class Storage