Middle+
152
'Қамқоршы' (Memento) паттерні деген не?
AI-дан жауап
sobes.tech AI
"Хранитель" (Memento) жобалау үлгісі объектінің алдыңғы күйін сақтауға және қалпына келтіруге мүмкіндік береді, оның жүзеге асырылу бөлшектерін ашпай.
Негізгі рөлдер:
- Бастапқы объект (Originator): Өзінің күйін сақтау керек объект. Ол сақтаушы объектіні құрады және оны өзінің күйін қалпына келтіру үшін пайдаланады.
- Хранитель (Memento): Бастапқы объектінің күйін сақтайтын объект. Оның тұтастығын қорғау үшін минималды интерфейсті ұсынуы керек.
- Қамқоршы (Caretaker): Хранительдерді сақтау жауапкершілігін алады. Ол бастапқы объектіден хранительді сұрайды және оны қайтадан бастапқы объектіге қалпына келтіру үшін береді. Қамқоршы хранительдің мазмұнымен тікелей әрекеттеспейді.
Жұмыс принципі:
- Бастапқы объект өзінің ағымдағы күйінің суретін қамтитын хранительді құрады.
- Қамқоршы бұл хранительді сақтайды (мысалы, тізімде).
- Қажет болғанда, бастапқы объектінің күйін қалпына келтіру үшін, қамқоршы сақталған хранительді қайтадан бастапқы объектіге береді.
- Бастапқы объект хранительдегі деректерден өзінің күйін қалпына келтіреді.
Артықшылықтары:
- Бастапқы объектінің инкапсуляциясын сақтайды.
- Жою (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())