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()