java23种设计模式-备忘录模式

定义

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

角色

发起人 Originator 负责创建备忘录对象或者从特定备忘录对象获取数据,以恢复到之前的某个状态。
备忘录 Rememtor 负责保存对象状态
负责人 CareTaker 维护Remento对象列表,当需要恢复状态时,从CareTaker中获取特定备忘录的状态

UML

实现

/**
 * desc : 发起人
 * Created by tiantian on 2018/8/26
 */
public class Originator {

    private String stat;

    public Memento creatMenemto() {
        return new Memento(this.stat);
    }

    public void setStatFromMemento(Memento memento) {
        this.stat = memento.getStat();
    }

    public void setStat(String stat) {
        this.stat = stat;
    }

    public String getStat() {
        return this.stat;
    }
}

/**
 * desc : 备忘录
 * Created by tiantian on 2018/8/26
 */
public class Memento {
    private String stat;

    public Memento(String stat) {
        this.stat = stat;
    }

    public void setStat(String s) {
        this.stat = s;
    }

    public String getStat() {
        return this.stat;
    }
}
/**
 * desc : 负责人
 * Created by tiantian on 2018/8/26
 */
public class CareTaker {
    private List<Memento> list = new ArrayList<>();

    public void add(Memento m) {
        this.list.add(m);
    }

    public Memento get(int i) {
        return this.list.get(i);
    }
}
public class Client {

    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        originator.setStat("Stat1");
        Memento memento = originator.creatMenemto();
        careTaker.add(memento);

        originator.setStat("Stat2");
        System.out.println("目前状态");
        System.out.println(originator.getStat());

        System.out.println("恢复后的状态");
        originator.setStatFromMemento(careTaker.get(0));
        System.out.println(originator.getStat());
    }

    output: 目前状态Stat2
              恢复后的状态
              Stat1

}

应用场景

单机游戏的存档,数据库事务等

总结

优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

猜你喜欢

转载自blog.csdn.net/m0_37577221/article/details/82083035