Sobes.tech
Middle+

Ի՞նչ է 'Memento' ձևանմուշը և ինչ իրավիճակներում է նպատակահարմար օգտագործել այն։

sobes.tech AI

Պատասխան AI-ից

"Պաշտպանիչ" (Memento) ձևանմուշը թույլ է տալիս պահպանել և վերականգնել օբյեկտի նախորդ վիճակը՝ չխախտելով ինկապսուլյացիան:

Համապատասխանություն:

  • Երբ անհրաժեշտ է պահպանել օբյեկտի վիճակը հետագա վերականգնման համար:
  • Երբ ուղղակի պահպանումը կխախտի օբյեկտի ինկապսուլյացիան:

Հիմնական մասնակիցներ:

  • Ծագող (Originator): Օբյեկտը, որի վիճակը պետք է պահպանվի: Ստեղծում է իր ընթացիկ վիճակի լուսանկար (Memento) և կարող է վերականգնել նրանից:
  • Լուսանկար (Memento): Օբյեկտ, որը պահպանում է Ծագողի վիճակը: Պահպանում է միայն այն, ինչ պետք է իմանան միայն նրանք, ովքեր պետք է:
  • Պահեստավոր (Caretaker): Պահպանում է լուսանկարները: Չի ճանաչում Ծագողի ներքին կառուցվածքը և չի աշխատում նրանց հետ ուղղակի, միայն փոխանցում է:

Օրինակ:

class Memento:
    def __init__(self, state):
        self._state = state

    def get_state(self):
        return self._state

class Originator:
    def __init__(self, state):
        self._state = state
        print(f"Ծագող: Նախնական վիճակն է՝ {self._state}")

    def do_something(self):
        print("Ծագող: Կարող եմ կարևոր բան անել.")
        self._state = self._generate_random_string()
        print(f"Ծագող: Իմ վիճակը փոխվեց՝ {self._state}")

    def save(self):
        print("Ծագող: Պահպանվում է Memento-ում.")
        return Memento(self._state)

    def restore(self, memento):
        self._state = memento.get_state()
        print(f"Ծագող: Վիճակ՝ վերականգնված Memento-ից՝ {self._state}")

    def _generate_random_string(self):
        import random
        import string
        return ''.join(random.choices(string.ascii_uppercase + string.digits, k=10))

class Caretaker:
    def __init__(self, originator):
        self._originator = originator
        self._mementos = []

    def backup(self):
        print("\nՊահեստավոր: Պահպանում է Ծագողի վիճակը...")
        self._mementos.append(self._originator.save())

    def undo(self):
        if not self._mementos:
            return

        memento = self._mementos.pop()
        print(f"Պահեստավոր: Վերականգնում է վիճակը՝ {memento.get_state()}")
        try:
            self._originator.restore(memento)
        except Exception:
            self.undo() # Եթե վերականգնումը չի հաջողվում, փորձում է նախորդ Memento-ն

    def show_history(self):
        print("Պահեստավոր: Լուսանկարների ցանկը:")
        for memento in self._mementos:
            print(memento.get_state())

# Օգտագործում
originator = Originator("SuperState")
caretaker = Caretaker(originator)

caretaker.backup()
originator.do_something()

caretaker.backup()
originator.do_something()

caretaker.backup()
originator.do_something()

print("\n")
caretaker.show_history()

print("\nՀաճախորդ: Հիմա՝ վերականգնում ենք!")
caretaker.undo()

print("\nՀաճախորդ: Մյուս անգամ!")
caretaker.undo()