Итак, вопрос в том, прав ли я?
Да, вы правы: все примеры являются неправильными реализациями шаблона проектирования Memento, потому что класс Memento
предоставляет свои внутренние зависимость через метод publi c. Как вы заметили, это позволяет Caretaker
(или любому другому классу) получать личную информацию о Originator
.
Предыдущие ответы фокусируются на состоянии внутреннего поля и на том, может ли состояние Memento
варьируются независимо от Originator
. Инкапсуляция нарушается в большей степени, чем путем выставления состояния: она нарушается путем раскрытия зависимостей. Метод получения publi c раскрывает тот факт, что Originator
зависит от String
. Это конфиденциальная информация, которая не должна быть раскрыта.
I wi sh Я мог бы сказать, что дезинформация необычна в отношении шаблонов проектирования; но вы найдете неточные и вводящие в заблуждение статьи о шаблонах проектирования в Inte rnet, в том числе здесь, в SO и Wikipedia .
Единственный источник со 100% гарантированной точностью - это оригинальный GoF книга. Онлайн-ресурсы всегда должны быть сверены с книгой. Что касается паттерна Memento, мне нравится статья https://refactoring.guru/design-patterns/memento.