【问题标题】:Why we need Caretaker class in Memento Pattern? Is it really so important?为什么我们需要 Memento Pattern 中的看守类?真的那么重要吗?
【发布时间】:2014-08-14 17:48:55
【问题描述】:

我目前正试图弄清楚 Memento Pattern 是如何工作的。我坚持使用Caretaker 类?拥有它真的很重要吗?我的意思是我可以在没有这个类的情况下使用 Memento。请在下面查看我的代码。

public class Originator {
    private String state;
    private Integer code;
    private Map<String, String> parameters;

    // Getters, setters and toString were omitted

    public Memento save() {
        return new Memento(this);
    }

    public void restore(Memento memento) {
        this.state = memento.getState();
        this.code = memento.getCode();
        this.parameters = memento.getParameters();
    }    
}

这是 Memento 的实现。

public class Memento {
    private String state;
    private Integer code;
    private Map<String, String> parameters;

    public Memento(Originator originator) {
        Cloner cloner = new Cloner();
        this.state = cloner.deepClone(originator.getState());
        this.code = cloner.deepClone(originator.getCode());
        this.parameters = cloner.deepClone(originator.getParameters());
    }

    // Getters and setters were omitted
}

这段代码运行良好,Memento 运行良好。

【问题讨论】:

  • Caretaker 类在哪里?
  • 我没有。其实我不明白我为什么需要它。
  • 这样一个简单的例子可能看起来差别不大,但它会帮助你稍后将这个构造代码和模型代码分开。有一个很好的视频:youtube.com/watch?v=RlfLCWKxHJ0
  • 想想单一职责原则和得墨忒耳定律,以及简化的测试和调试。

标签: java design-patterns memento


【解决方案1】:

看守者是调用Originator 上的save()restore() 方法的类。它保留(处理)Memento 类的集合,并决定何时检查点或回滚数据。

【讨论】:

  • 但是我可以直接对我的实例执行所有这些操作。像这样Memento memento = originator.save();Caretaker 有什么意义?存储Mementos 的集合还是为了什么?
  • 是的,存储Mementos 的集合。创建Mementos 是没有用的,除非您保留它们以便以后恢复。这是看门人的工作。
  • 好的。在这种情况下,我可以在 Caretaker 中添加搜索某个 Memento 对象的逻辑吗?
  • 当然,你可以在那里做任何你想做的事。也许您是根据时间或某些操作的重复次数等创建它们。看守者的目的是封装此逻辑,以便将其放在一个地方,并且在您的整个过程中都不会引用 Mementos应用程序。
猜你喜欢
  • 2020-08-29
  • 2019-06-09
  • 1970-01-01
  • 2018-01-01
  • 2020-12-17
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多