Что означает «без нарушения инкапсуляции» в паттерне Memento - PullRequest
3 голосов
/ 10 ноября 2019

В описании к шаблону Memento из Википедии говорится, что:

  • Внутреннее состояние объекта должно быть сохранено извне, чтобы его можно было восстановить. позже к этому состоянию.

  • Инкапсуляция объекта не должна нарушаться.

Я не совсем понимаю, как можно инкапсулироватьнарушены? Это относится к методам получения полей, хранящихся в памяти?

Ответы [ 3 ]

2 голосов
/ 10 ноября 2019

Я не понимаю, как можно нарушить инкапсуляцию? Это относится к методам получения полей, хранящихся в памяти?

Да, это относится к методам получения полей, которые должны храниться в памяти. Объект, имеющий эти поля (он же Исходный), не хочет нарушать собственную инкапсуляцию, публично выставляя свои поля. Тогда проблема заключается в том, как сохранить поля (в Memento), не делая их открытыми.

Другими словами, как мы можем сохранить частные поля без добавления методов-получателей? Мы не хотим нарушать инкапсуляцию, подвергая каким-либо образом данные внутри нашего объекта (Originator).

Рефакторинг Гуру имеет отличную статью, объясняющую это.

2 голосов
/ 10 ноября 2019

Я думаю, что это относится к 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;
    }
}
0 голосов
/ 10 ноября 2019

Это похоже на механизм UNDO, который позволяет пользователям отказаться от предварительных операций или восстановиться после ошибок. Итак, чтобы вернуться в предыдущее состояние, вам нужно будет где-то его сохранить. Однако объекты обычно инкапсулируют некоторые или все их состояния, делая его недоступным для других объектов и невозможным для сохранения извне. Предоставление этого состояния нарушит инкапсуляцию, что может поставить под угрозу надежность и расширяемость приложения. Здесь шаблон сувенира приходит на изображение, регистрируя состояние объекта и защищая объекты внутренней структуры (защита свойства инкапсуляции).

Для реализации этого шаблона необходимы три объекта:

  1. Источник:имеет внутреннее состояние и использует память для восстановления и сохранения своего внутреннего состояния.
  2. Сторож: хранит и отслеживает объект памятки и отвечает за его сохранность. Он отправляет объект отправителю для сохранения или восстановления его исходного состояния.
  3. Примечание: хранит внутреннее состояние объекта отправителя и защищает объект от доступа других объектов, кроме отправителя.
...