首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >备忘录模式:发起人类中createMemento()方法的哲学

备忘录模式:发起人类中createMemento()方法的哲学
EN

Software Engineering用户
提问于 2021-03-26 22:09:23
回答 1查看 91关注 0票数 0

我对createMemento()在Memento模式中的创建者类的哲学提出了质疑。

我的老师说:

既然Originator类不再在内部存储Memento对象,我们应该给它两个新的方法: createMemento()和setMemento()。createMemento()方法将发端者的当前状态存储在Memento对象中并返回它。所以我们调用这个方法,然后说,“嘿,保存你当前的状态给我”,我们会得到一个Memento对象。

我很困惑。因为当我试图实现内部存储Memento列表的发起人类时,我仍然需要这个createMemento()方法。

我的班级:

代码语言:javascript
复制
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对象),我必须实现该方法。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2021-03-27 12:51:34

记忆模式的目的是根据GoF

在不违反封装的情况下,捕获和外部化一个对象的内部状态,以便以后可以将该对象恢复到此状态。

您的实现是不同的:通过将纪念品保存在堆栈中,使其成为对象状态的一部分。因此,您有一个了解其自身历史的对象。这是一个非常不同的设计。并且为了对象的所有可能使用,您强制一步一步地恢复到每个连续的先前状态的行为。在这样的设计中,有些人会担心单一责任原则的尊重。

GoF备忘录赋予保管者保留纪念品的责任。这具有分离关注点的优点和更好的可重用性。如果要以LIFO方式管理纪念品,可以使用堆栈。但是,您可能会有几个快照,并希望直接回到这些快照中的任何一个。有了备忘录模式,备忘录和发起人将保持不变。只有看门人和周围的班级才会改变,以满足不同的需要。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/423838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档