(十三)备忘录模式-代码实现

介绍

概念:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

应用场景:需要保存某个对象的某个时间的状态,如游戏的暂停,存档,恢复功能. 如果把数据库与实体关联起来了,也可以说数据库是这个对象的备忘录.

接来下实现一个游戏存档与读档的功能

代码:

//游戏类

package note.com.memento;

import java.math.BigDecimal;
import java.util.ArrayList;

public class DiningRoom {
    private Integer waiter = 1;//服务员初始1
    private String name = "default";//默认名称
    private BigDecimal money  = new BigDecimal(500);//初始金钱500
    private ArrayList<String> foods = new ArrayList<String>();

    public DiningRoom(){
        foods.add("小鸡炖蘑菇");
        foods.add("剁椒鱼头");
        foods.add("狗不理包子");
    }

    /*
     * 读档
     */
    public DiningRoom(SaveGame game){
        this.waiter = game.getWaiter();
        this.name = game.getName();
        this.money = game.getMoney();
        this.foods = game.getFoods();
        System.out.println("读取档案....");
        draw();
    }

    /*
     * 开始游戏
     */
    public void start(){
        System.out.println("游戏开始......");
        draw();
    }

    public void draw(){
        System.out.println("绘制显示......");
    }

    public void openDoor(){
        System.out.println("开业");
    }

    public void closeDoor(){
        System.out.println("打烊");
    }

    /*
     * 恢复游戏
     */
    public void back(SaveGame game){
        this.waiter = game.getWaiter();
        this.name = game.getName();
        this.money = game.getMoney();
        this.foods = game.getFoods();
        System.out.println("恢复档案...");
        draw();
    }

    /*
     * 存档
     */
    public SaveGame save(){
        return new SaveGame(this);
    }

    public void show(){
        System.out.println("餐厅名称:"+this.name);
        System.out.println("余额:"+this.money.toString());
        System.out.println("服务员:"+this.waiter+"人");
    }

    public Integer getWaiter() {
        return waiter;
    }

    public void setWaiter(Integer waiter) {
        this.waiter = waiter;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    public ArrayList<String> getFoods() {
        return foods;
    }

    public void setFoods(ArrayList<String> foods) {
        this.foods = foods;
    }

}

//存档实体

package note.com.memento;

import java.math.BigDecimal;
import java.util.ArrayList;

/**
 * 存档
 * @author lxz
 *
 */
public class SaveGame {
    private Integer waiter = 1;//服务员初始1
    private String name = "default";//默认名称
    private BigDecimal money  = new BigDecimal(500);//初始金钱500
    private ArrayList<String> foods = new ArrayList<String>();
    public SaveGame(DiningRoom room){
        this.waiter = room.getWaiter();
        this.name = room.getName();
        this.money = room.getMoney();
        this.foods = room.getFoods();
    }

    public Integer getWaiter() {
        return waiter;
    }
    public void setWaiter(Integer waiter) {
        this.waiter = waiter;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public BigDecimal getMoney() {
        return money;
    }
    public void setMoney(BigDecimal money) {
        this.money = money;
    }
    public ArrayList<String> getFoods() {
        return foods;
    }
    public void setFoods(ArrayList<String> foods) {
        this.foods = foods;
    }

}

//测试类

package note.com.memento;

import java.math.BigDecimal;

public class MementoTest {
    public static void main(String[] args) {
        DiningRoom game = new DiningRoom();
        game.show();
        game.start();
        game.setMoney(new BigDecimal(2000));
        game.setName("小洋人");
        game.show();//显示当前状态
        SaveGame save1 = game.save();
        game.setName("大洋人");
        game.show();//显示当前状态
        game.back(save1);//恢复到修改名称之前
        game.show();//恢复后状态

        //===================重新打开游戏
        System.out.println("=====重新开始=======");
        DiningRoom game2 = new DiningRoom(save1);//重新打开游戏读取存档
        game2.show();//存档状态
    }
}

//结果

餐厅名称:default
余额:500
服务员:1人
游戏开始......
绘制显示......
餐厅名称:小洋人
余额:2000
服务员:1人
餐厅名称:大洋人
余额:2000
服务员:1人
恢复档案...
绘制显示......
餐厅名称:小洋人
余额:2000
服务员:1人
=====重新开始=======
读取档案....
绘制显示......
餐厅名称:小洋人
余额:2000
服务员:1人

备忘录模式是比较容易理解的了.

时间: 2024-08-10 02:02:38

(十三)备忘录模式-代码实现的相关文章

备忘录模式(Memento)

一.备忘录模式介绍 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 例如: 1.office重新打开时的恢复功能. 2.事务的回滚操作 备忘录模式UML图: Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态. Originator可根据需要决定Memento存储Originator的哪些内部状态 Memento(备忘录):负责存储Origi

面向对象编程思想-备忘录模式

一.引言 上篇博文中我们分享了访问者模式,访问者模式是把作用于数据结构上的操作封装到访问者类中,使得数据结构与操作分离.今天我们要学习的备忘录模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应行为),而备忘录模式保存的是发起人的状态(状态对应数据内部结构,如属性).下面请看今天要学习的访问者模式 二.备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态 下面是备忘录模式的结构图: 下面是备

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

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

C#面向对象设计之——备忘录模式Memento Pattern(二十三)

一.前言 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象回复到原先保存的状态. 二.结构图 三.实例代码 using System; using System.Collections.Generic; using System.Text; namespace 备忘录模式 { class Program { static void Main(string[] args) { Originator o = new Originator()

Java设计模式应用——备忘录模式

备忘录模式主要用于存档.游戏中我们打boss前总会存档,如果打boss失败,则读取存档,重新挑战boss. 可以看出来,备忘录模式一般包括如下数据结构 1. 存档文件:用于恢复备份场景的必要数据: 2. 存档管理器:用于管理存档,包括存档的读写与展示: 3. 被存档的对象. 下面以射击游戏的存档来举例: 1. 射击选手 package com.coshaho.learn.memorandum; // 射击手 public class Shooter { // 血量 private int blo

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

4 行为型模式之- 备忘录模式

备忘录模式介绍: 备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,这有点像我们平时说的"后悔"药.备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外界访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露 备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可以将对象恢复到原先的状态 对于备忘录模式来说,比较贴切的场景应该是游戏中的存档功能,该功能就是将游戏进度存储到

备忘录模式

备忘录模式,望文生义就知道它是用来做备忘的,或者可以直接说是“备份”.当需要保存当前状态,以便在不久要恢复此状态时,就可以使用“备忘录模式”.将当前”状态“备份,是不是又new一个类,然后将每个字段方法copy过去就可以了呢?或者说使用我们之前clone方法做深复制浅复制呢?其实不然,在<大话设计模式>中,作者提到了原因,这样会暴露更多的细节给客户端,不符合我们面向对象的思想.什么是暴露更多的细节给客户端?我们来看下面一段代码. 1 package day_27_memento; 2 3 /*

设计模式(12)---备忘录模式

备忘录模式   Memento (行为型模式) 1.概述 备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 例如:一些软件提供的撤销功能,游戏的存档读档功能. 2.结构图 3.代码 1 /* 2 * 原发器类 Originator 3 */ 4 public class Role { 5 6 private int level ; 7 private int life ; 8 9 public Role() { 10