Что делает паттерн Memento
Что проверяют
Знаете ли вы, что Memento это снимок состояния без вскрытия внутренностей объекта, и видите ли его в штатных механизмах Android, а не только в учебном примере на бумаге.
Как отвечать
Участников трое. Originator умеет сделать снимок себя и восстановиться из него. Memento хранит состояние и снаружи непрозрачен. Caretaker складывает снимки и решает, какой вернуть, но внутрь не заглядывает. Смысл именно в последнем: хранитель не получает доступа к полям, инкапсуляция не ломается.
data class FormSnapshot(val email: String, val text: String)
class FormState {
private var email = ""
private var text = ""
fun snapshot() = FormSnapshot(email, text)
fun restore(s: FormSnapshot) { email = s.email; text = s.text }
}В Android паттерн уже встроен: onSaveInstanceState с Bundle и SavedStateHandle во ViewModel это тот же контракт, где система играет роль хранителя, а экран роль объекта. Из прикладного: стек отмены в редакторе, черновик формы, откат фильтров.
Про ограничения стоит сказать самому: каждый снимок занимает память, поэтому историю держат ограниченной по длине или по весу. Bundle едет через binder, и крупные данные дают TransactionTooLargeException, туда кладут идентификаторы, а тело перечитывают из хранилища.
Где спотыкаются
Хранитель начинает читать поля снимка и подправлять их. Тогда паттерн теряет смысл: ради сокрытия состояния он и заводится. В учебных примерах на Java это видно сразу, там печатают приватное поле объекта напрямую, и такой код даже не компилируется.
Второе: путают с Command. Memento хранит состояние целиком, Command хранит операцию и способ её обратить. На длинной истории правок снимки прожорливы, и отмену делают именно операциями.
Третье: кладут в снимок ссылки на живые объекты: контекст, вью, курсор базы. Снимок перестаёт быть копией, начинает меняться вместе с оригиналом и держит уничтоженный экран в памяти.