Sobes.tech
Middle+
152

'Қамқоршы' (Memento) паттерні деген не?

AI-дан жауап

sobes.tech AI

"Хранитель" (Memento) жобалау үлгісі объектінің алдыңғы күйін сақтауға және қалпына келтіруге мүмкіндік береді, оның жүзеге асырылу бөлшектерін ашпай.

Негізгі рөлдер:

  • Бастапқы объект (Originator): Өзінің күйін сақтау керек объект. Ол сақтаушы объектіні құрады және оны өзінің күйін қалпына келтіру үшін пайдаланады.
  • Хранитель (Memento): Бастапқы объектінің күйін сақтайтын объект. Оның тұтастығын қорғау үшін минималды интерфейсті ұсынуы керек.
  • Қамқоршы (Caretaker): Хранительдерді сақтау жауапкершілігін алады. Ол бастапқы объектіден хранительді сұрайды және оны қайтадан бастапқы объектіге қалпына келтіру үшін береді. Қамқоршы хранительдің мазмұнымен тікелей әрекеттеспейді.

Жұмыс принципі:

  1. Бастапқы объект өзінің ағымдағы күйінің суретін қамтитын хранительді құрады.
  2. Қамқоршы бұл хранительді сақтайды (мысалы, тізімде).
  3. Қажет болғанда, бастапқы объектінің күйін қалпына келтіру үшін, қамқоршы сақталған хранительді қайтадан бастапқы объектіге береді.
  4. Бастапқы объект хранительдегі деректерден өзінің күйін қалпына келтіреді.

Артықшылықтары:

  • Бастапқы объектінің инкапсуляциясын сақтайды.
  • Жою (undo) және қайтару (redo) механизмдерін жүзеге асыруға мүмкіндік береді.
  • Объектінің күйін басқаруды жеңілдетеді.

Кемшіліктері:

  • Хранительдерді құру жадыға қымбатқа түсуі мүмкін, әсіресе үлкен объектілер үшін.
  • Хранительдің күйі басқаруға қиын болуы мүмкін.

Қарапайым іске асыру мысалы:

# Бастапқы объект
class Originator:
    def __init__(self, state):
        self._state = state
        print(f"Originator: Бастапқы күй {self._state} болып табылады")

    def do_something(self):
        print("Originator: Маңызды бір нәрсе істеп жатырмын.")
        self._state = self._state + "_changed" # Күйін өзгерту
        print(f"Originator: Менің күйім өзгерді: {self._state}")

    def save(self):
        print("Originator: Мементоға сақтаймын.")
        return Memento(self._state) # Хранительді құру

    def restore(self, memento):
        self._state = memento.get_state() # Хранительден күйді қалпына келтіру
        print(f"Originator: Күйім қалпына келтірілді: {self._state}")

# Хранитель
class Memento:
    def __init__(self, state):
        self._state = state

    def get_state(self):
        return self._state

# Қамқоршы
class Caretaker:
    def __init__(self, originator):
        self._originator = originator
        self._mementos = []

    def backup(self):
        print("\nCaretaker: Originator-дің күйін сақтаймын...")
        self._mementos.append(self._originator.save())

    def undo(self):
        if not self._mementos:
            print("\nCaretaker: Қалпына келтіруге мему жоқ.")
            return

        memento = self._mementos.pop() # Соңғы хранительді алу
        print(f"\nCaretaker: Күйді қайтадан: {memento.get_state()}")
        try:
            self._originator.restore(memento)
        except Exception:
            self.undo() # Қате болған жағдайда, алдыңғы хранительді пайдалану (міндетті емес)

    def show_history(self):
        print("Caretaker: Мему тізімі:")
        for memento in self._mementos:
            print(memento.get_state())