Что такое паттерн мономента
Что проверяют
Название в вопросе искажено, за ним стоит поведенческий паттерн Хранитель, он же Memento или Снимок. Проверяют, умеете ли вы сохранять и восстанавливать состояние объекта, не вскрывая его устройство, и связываете ли это с главной особенностью Android: процесс приложения могут убить в любой момент, а экран обязан вернуться в прежнее состояние.
Как отвечать
Хранитель фиксирует внутреннее состояние объекта в отдельный снимок и позволяет позже восстановить объект из него, не раскрывая наружу его поля. Ролей три: создатель делает и принимает снимок, снимок непрозрачен для всех остальных, опекун хранит снимки и решает, когда откатываться.
data class EditorSnapshot(val text: String, val cursor: Int)
class Editor {
private var text = ""
private var cursor = 0
fun snapshot() = EditorSnapshot(text, cursor)
fun restore(s: EditorSnapshot) {
text = s.text
cursor = s.cursor
}
}Где это живёт в Android: отмена и повтор действий в редакторах, чекпойнты многошаговых форм, а также сохранение состояния экрана. Механизмы onSaveInstanceState и SavedStateHandle устроены ровно так же: объект отдаёт свой снимок системе, переживает пересоздание или смерть процесса и восстанавливается из него.
Где спотыкаются
Делают снимок изменяемым или кладут в него ссылку на сам объект. Тогда откат возвращает уже испорченное состояние, а стек отмены хранит пачку ссылок на один и тот же объект. Снимок это значение, и лучше всего для него подходит неизменяемый тип данных.
Складывают в снимок всё подряд, включая картинки и списки целиком. Состояние экрана уезжает через межпроцессное взаимодействие с жёстким ограничением на размер, и приложение падает с ошибкой слишком большой транзакции. В снимок кладут идентификаторы, позиции и введённый текст, тяжёлое перечитывают заново.
Путают с соседними паттернами. Состояние меняет поведение объекта при переходах, прототип клонирует объект для дальнейшей самостоятельной жизни, а хранитель нужен только чтобы вернуться назад и ничего больше не умеет.