备忘录模式

备忘录模式

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

类图:

备忘录模式_第1张图片

备忘录模式的角色:

  • 发起人(Originator):要被备份的成员,它提供一创建备忘录的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中。并提供另外一个方法将备忘录中的信息覆盖自身的信息。
  • 备忘录(Memento):备忘录对象中包含存储发起人状态的成员变量,它提供set,get或构造方法保存发起人状态及获取发起人状态。
  • 管理角色(Caretaker):用于管理备忘录对象的实现类。

具体代码实现:

Originator.java

package com.example;

import java.util.HashMap;
import java.util.Map;


public class Originator {
    private Map map;
    private int hp;
    private int mp;
    private int score;
    private int level;

    public Originator() {
        hp = 100;
        mp = 100;
        score = 0;
        level = 0;
        map = new HashMap<>();
    }

    public void startPlay() {
        print("game start before info");
        map.clear();
        hp -= 10;
        mp -= 5;
        score += 20;
        level += 1;
        map.put("hp", hp);
        map.put("mp", mp);
        map.put("score", score);
        map.put("level", level);
    }

    private void print(String info) {
        System.out.println(info + ":-->" + "hp:" + map.get("hp") + "   mp:" + map.get("mp") + "   score:" + map.get("score") + "   level:" + map.get("level"));
    }

    public Memento createMemeto() {
        print("game save info");
        Memento memento = new Memento();
        memento.setState(map);
        return memento;
    }

    public void restore(Memento memento) {
        map = memento.getState();
        print("game restore info");
    }

    public void exit() {
        hp = 0;
        mp = 0;
        score = 0;
        level = 0;
        map.clear();
        print("game exit info");
    }
}

Memento.java

public class Memento {
    private Map map = new HashMap<>();

    public Memento() {

    }

    public Map getState() {
        return map;
    }

    public void setState(Map map) {
        this.map.putAll(map);
    }
}

Caretaker.java

public class Caretaker {
    private Memento memento;

    public void save(Memento memento) {
        this.memento = memento;
    }

    public Memento get() {
        return memento;
    }
}

Client.java

public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.startPlay();//开始游戏

        Caretaker manager = new Caretaker();
        manager.save(originator.createMemeto());//游戏存档

        originator.exit();//游戏退出
        originator.restore(manager.get());//恢复存档信息
    }
}

你可能感兴趣的:(设计模式,设计模式)