我对createMemento()在Memento模式中的创建者类的哲学提出了质疑。
我的老师说:
既然
Originator类不再在内部存储Memento对象,我们应该给它两个新的方法: createMemento()和setMemento()。createMemento()方法将发端者的当前状态存储在Memento对象中并返回它。所以我们调用这个方法,然后说,“嘿,保存你当前的状态给我”,我们会得到一个Memento对象。
我很困惑。因为当我试图实现内部存储Memento列表的发起人类时,我仍然需要这个createMemento()方法。
我的班级:
public class MyOriginator {
private String content;
//stores a list of Momento internally
private List<Momento> previousStates;
public MyOriginator() {
previousStates = new ArrayList<>();
}
public void push() {
previousStates.add(createMomento());
}
// need to have it.
private Momento createMomento() {
return new Momento(content);
}
public void pop() {
int lastIndex = previousStates.size() - 1;
this.content = previousStates.get(lastIndex).getContent();
previousStates.remove(lastIndex);
}
}因此,createMemento()似乎与在内部存储或不存储Memento对象无关,而在内部存储或不存储Memento对象并不是创建和使用createMemento()的原因。
使用和创建此方法的原因是什么?在这两种情况下(在内部存储Memento对象,而不是在内部存储Memento对象),我必须实现该方法。
发布于 2021-03-27 12:51:34
在不违反封装的情况下,捕获和外部化一个对象的内部状态,以便以后可以将该对象恢复到此状态。
您的实现是不同的:通过将纪念品保存在堆栈中,使其成为对象状态的一部分。因此,您有一个了解其自身历史的对象。这是一个非常不同的设计。并且为了对象的所有可能使用,您强制一步一步地恢复到每个连续的先前状态的行为。在这样的设计中,有些人会担心单一责任原则的尊重。
GoF备忘录赋予保管者保留纪念品的责任。这具有分离关注点的优点和更好的可重用性。如果要以LIFO方式管理纪念品,可以使用堆栈。但是,您可能会有几个快照,并希望直接回到这些快照中的任何一个。有了备忘录模式,备忘录和发起人将保持不变。只有看门人和周围的班级才会改变,以满足不同的需要。
https://softwareengineering.stackexchange.com/questions/423838
复制相似问题