Введение
В мире разработки программного обеспечения существует постоянная потребность в создании удобных в сопровождении, надежных и многоразовых решений для решения общих проблем. Одним из таких решений является Memento Design Pattern, помогающий сохранять и восстанавливать внутреннее состояние объекта, не нарушая его инкапсуляцию. Этот шаблон может быть особенно полезен, когда вы хотите реализовать такие функции, как отмена и повтор действий, или когда вам нужно поддерживать моментальные снимки состояния объекта в разные моменты времени.
В этом посте мы рассмотрим шаблон Memento, его ключевые компоненты и практический пример в Go. К концу этой статьи у вас будет четкое представление о том, как работает шаблон Memento и как вы можете применять его в своих собственных проектах.
Ключевые компоненты паттерна Memento:
- Источник: объект, состояние которого необходимо сохранить и восстановить. Он создает сувенир, содержащий моментальный снимок своего текущего внутреннего состояния, и использует этот сувенир для восстановления своего состояния при необходимости.
- Memento: объект, в котором хранится внутреннее состояние Создателя. Мементо должен быть доступен только Создателю, сохраняя инкапсуляцию состояния Создателя.
- Смотритель: отвечает за управление хранением и поиском сувениров. Он поддерживает коллекцию сувениров, но не имеет прямого доступа к их состоянию.
Пример в Go
В следующих разделах мы рассмотрим реализацию шаблона Memento в Go, показав, как компоненты Originator, Memento и Caretaker взаимодействуют для сохранения и восстановления состояния объекта.
package main import "fmt" // Originator is the object whose state we want to save and restore. type Originator struct { state string } // SetState sets the state of the Originator. func (o *Originator) SetState(state string) { o.state = state } // GetState returns the state of the Originator. func (o *Originator) GetState() string { return o.state } // SaveToMemento creates a Memento object that stores the state of the Originator. func (o *Originator) SaveToMemento() *Memento { return &Memento{state: o.state} } // RestoreFromMemento restores the state of the Originator from a Memento object. func (o *Originator) RestoreFromMemento(m *Memento) { o.state = m.GetSavedState() } // Memento is the object that stores the saved state of the Originator. type Memento struct { state string } // GetSavedState returns the state of the Originator. func (m *Memento) GetSavedState() string { return m.state } // Caretaker is responsible for storing and restoring mementos. type Caretaker struct { mementos []*Memento } // AddMemento adds a Memento to the Caretaker. func (c *Caretaker) AddMemento(m *Memento) { c.mementos = append(c.mementos, m) } // GetMemento returns a Memento from the Caretaker. func (c *Caretaker) GetMemento(index int) *Memento { return c.mementos[index] } func main() { originator := &Originator{} caretaker := &Caretaker{} originator.SetState("State1") originator.SetState("State2") caretaker.AddMemento(originator.SaveToMemento()) originator.SetState("State3") caretaker.AddMemento(originator.SaveToMemento()) originator.SetState("State4") fmt.Println("Current State:", originator.GetState()) originator.RestoreFromMemento(caretaker.GetMemento(0)) fmt.Println("First saved State:", originator.GetState()) originator.RestoreFromMemento(caretaker.GetMemento(1)) fmt.Println("Second saved State:", originator.GetState()) }
В этом примере у нас есть три основных компонента: Originator
, Memento
и Caretaker
. Originator
— это объект, состояние которого мы хотим сохранить и восстановить. Memento
хранит состояние Originator
. Caretaker
отвечает за хранение и восстановление объектов Memento
.
В функции main
мы создаем Originator
и Caretaker
. Затем мы устанавливаем различные состояния для Originator
и сохраняем некоторые из этих состояний с помощью файла Caretaker
. Наконец, мы восстанавливаем сохраненные состояния и распечатываем их.
Заключение
Шаблон проектирования Memento — ценный инструмент разработки программного обеспечения, позволяющий разработчикам сохранять и восстанавливать состояние объекта, не нарушая его инкапсуляцию. Поняв и применяя этот шаблон, вы можете легко реализовать функции отмены и повтора, поддерживать моментальные снимки состояния объекта или даже создать систему управления версиями для своих проектов. На предоставленном примере Go вы можете увидеть, как шаблон Memento может быть реализован и включен в ваши собственные проекты программного обеспечения.
Если вам нравится читать статьи на Medium и вы заинтересованы в том, чтобы стать участником, я буду рад поделиться с вами своей реферальной ссылкой!