3

维基百科对Memento 模式的描述指出:

  • 对象的内部状态应该保存在外部,以便以后可以将对象恢复到该状态。

  • 不得违反对象的封装。

我对如何违反封装感到困惑?它是指存储在 memento 中的字段的 getter 方法吗?

4

2 回答 2

2

我认为它指的是Memento对象封装,它用于恢复状态并且只能从 Originator 访问

如果您在实现Memento对象中注意到没有设置器,则其内部状态仅在构造函数/创建时更新

public static class Memento {
    private final String state;    
    public Memento(String stateToSave) {
        state = stateToSave;
    }       
    // accessible by outer class only
    private String getSavedState() {
        return state;
    }
}
于 2019-11-10T11:42:13.973 回答
2

我对如何违反封装感到困惑?它是指存储在 memento 中的字段的 getter 方法吗?

是的,它指的是要存储在 Memento 中的字段的 getter 方法。具有这些字段的对象(又名 Originator)不想通过公开暴露其字段来违反其自身的封装。那么问题是如何在不公开的情况下保存字段(到备忘录中)。

换句话说,我们如何在不添加 getter 方法的情况下保存私有字段?我们不想通过以任何方式暴露我们(Originator)对象中的数据来违反封装。

Refactoring Guru有一篇很好的文章解释了这一点。

于 2019-11-10T15:17:09.300 回答