在互联网上,我遇到了一些我认为完全不正确的备忘录模式的实现示例。它们可以用 Java 和 C# 编写。
这里有几个
编码:
public class Originator
{
private string _state; //the private field of originator that shouldn't be exposed!!!!
public Memento CreateMemento()
{
return new Memento(_state);
}
public void SetMemento(Memento memento)
{
_state = memento.GetState();
}
}
public class Memento
{
private string _state;
public Memento(string state)
{
_state = state;
}
public string GetState()
{
return _state; // here caretaker can access to private field of originator!!!
}
}
public class Caretaker
{
public Memento Memento { get; set; }
}
在代码中,我留下了应该描述情况的注释。
caretaker 类可以通过 memento 读取始发者的私有字段,这违反了 memento 模式的主要原则之一:
不得违反对象的封装。
所以问题是我是对的吗?