1.16(设计模式)备忘录模式

时间:2019-06-12
本文章向大家介绍1.16(设计模式)备忘录模式,主要包括1.16(设计模式)备忘录模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

备忘录模式,在不破坏对象封装的情况下,获取对象状态并将其保存下来。

比如游戏关卡的存档。

游戏状态类

通过saveStatefToMemento()方法存储状态

public class Originator {
    //攻击力
    private int aggressivity;
    //防御力
    private int defense;
    //关卡
    private int checkpoint;
    
    public Originator(int aggressivity, int defense, int checkpoint) {
        super();
        this.aggressivity = aggressivity;
        this.defense = defense;
        this.checkpoint = checkpoint;
    }

    public int getAggressivity() {
        return aggressivity;
    }

    public int getDefense() {
        return defense;
    }

    public int getCheckpoint() {
        return checkpoint;
    }
    
    public void setAggressivity(int aggressivity) {
        this.aggressivity = aggressivity;
    }

    public void setDefense(int defense) {
        this.defense = defense;
    }

    public void setCheckpoint(int checkpoint) {
        this.checkpoint = checkpoint;
    }

    public void setAll(int aggressivity, int defense, int checkpoint) {
        this.aggressivity = aggressivity;
        this.defense = defense;
        this.checkpoint = checkpoint;
    }
    //保存状态
    public Memento saveStatefToMemento() {//使用一个Memento类保存状态,可以保证Originator的封装性
        return new Memento(aggressivity, defense, checkpoint);
    }
    //获取状态
    public void getStateFromMemento(Memento memento) {
        this.aggressivity = memento.getAggressivity();
        this.defense = memento.getDefense();
        this.checkpoint = memento.getCheckpoint();
    }
    
    @Override
    public String toString() {
        return "Originator [aggressivity=" + aggressivity + ", defense=" + defense + ", checkpoint=" + checkpoint + "]";
    }
    
}

保存游戏状态的类

该类的属性时根据Originator 类的属性设置的,

通过该类保存游戏状态,可以保证原有类的封装性。

public class Memento {
    //攻击力
    private int aggressivity;
    //防御力
    private int defense;
    //关卡
    private int checkpoint;
    public Memento(int aggressivity, int defense, int checkpoint) {
        super();
        this.aggressivity = aggressivity;
        this.defense = defense;
        this.checkpoint = checkpoint;
    }
    
    public int getAggressivity() {
        return aggressivity;
    }
    
    public int getDefense() {
        return defense;
    }
    
    public int getCheckpoint() {
        return checkpoint;
    }

}

获取存储状态的类

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

public class CareTaker {
    private Map<String,Memento> mementosMap = new HashMap<String,Memento>();
    
    public void add(String keepInTheArchivesName,Memento memento) {
        mementosMap.put(keepInTheArchivesName, memento);
    }
    
    public Memento get(String keepInTheArchivesName) {
        return mementosMap.get(keepInTheArchivesName);
    }
}

Main

public class Main {
    public static void main(String[] args) {
        Originator originator = new Originator(0, 0, 0);
        CareTaker careTaker = new CareTaker();
        
        originator.setAll(100,50,1);
        originator.setAll(200,70,2);
        careTaker.add("存档一(已过第二关)",originator.saveStatefToMemento());
        originator.setAll(400,100,3);
        careTaker.add("存档一(已过第三关)",originator.saveStatefToMemento());
        originator.setAll(500,150,4);
        
        System.out.println("current:" + originator);
        
        System.out.println("获取存档一状态");
        originator.getStateFromMemento(careTaker.get("存档一(已过第二关)"));
        System.out.println(originator);
        System.out.println("获取存档二状态");
        originator.getStateFromMemento(careTaker.get("存档一(已过第三关)"));
        System.out.println(originator);
        
    }
}
运行结果:
current:Originator [aggressivity=500, defense=150, checkpoint=4] 获取存档一状态 Originator [aggressivity=200, defense=70, checkpoint=2] 获取存档二状态 Originator [aggressivity=400, defense=100, checkpoint=3]

参考资料:

https://www.runoob.com/design-pattern/memento-pattern.html

原文地址:https://www.cnblogs.com/huang-changfan/p/11010899.html