Введение

В мире разработки программного обеспечения существует постоянная потребность в создании удобных в сопровождении, надежных и многоразовых решений для решения общих проблем. Одним из таких решений является Memento Design Pattern, помогающий сохранять и восстанавливать внутреннее состояние объекта, не нарушая его инкапсуляцию. Этот шаблон может быть особенно полезен, когда вы хотите реализовать такие функции, как отмена и повтор действий, или когда вам нужно поддерживать моментальные снимки состояния объекта в разные моменты времени.

В этом посте мы рассмотрим шаблон Memento, его ключевые компоненты и практический пример в Go. К концу этой статьи у вас будет четкое представление о том, как работает шаблон Memento и как вы можете применять его в своих собственных проектах.

Ключевые компоненты паттерна Memento:

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

Пример в 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 и вы заинтересованы в том, чтобы стать участником, я буду рад поделиться с вами своей реферальной ссылкой!

https://medium.com/@adamszpilewicz/membership