반응형
Notice
Recent Posts
Recent Comments
- Today
- Total
작심삼일
10주차. Memento 본문
728x90
반응형
디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.
틀린 부분은 알려주시면 감사하겠습니다.
어떤 패턴인가
캡슐화를 위배하지 않은 채 어떤 객체의 내부 상태를 잡아내고 실체화시켜 둠으로써, 이후 해당 객체가 그 상태로 되돌아올 수 있도록 합니다.
객체의 상태를 저장해둔 후 복원해야할 때 사용한다.
캡슐화된 경계를 유지할 수 있다.
Originator 클래스가 많은 양의 정보를 저장해야 할 때나 상당히 자주 메멘토를 반환해야 할 때라면 상당한 오버헤드를 가져올 수 있다.
어떻게 쓰는가
Memento: 원조본 객체의 내부 상태를 저장합니다.
Originator: 원조본 객체
Caretaker: 메멘토의 보관을 책임지는 보관자
class Memento:
def __init__(self, state):
self.state = state
class Originator:
def __init__(self):
self.state = None
def setState(self, state):
self.state = state
def create_memento(self):
return Memento(self.state)
def get_memento_state(self, memento):
self.state = memento.state
class Caretaker(list):
pass
------------------------------------------------------------------------------
ori = Originator()
car = Caretaker()
ori.state = "S 1"
ori.state = "S 2"
car.append(ori.create_memento())
ori.state = "S 3"
car.append(ori.create_memento())
ori.state = "S 4"
print('Current state: ' + ori.state) # Current state: S 4
ori.get_memento_state(car[0])
print('1st saved state: ' + ori.state) # 1st saved state: S2
ori.get_memento_state(car[1])
print('2st saved state: ' + ori.state) # 2st saved state: S3
어디서 활용되는가
이는 책의 내용 (p. 373)을 그대로 가져왔다.
1. 어떤 객체의 상태에 대한 스냅샷을 저장한 후 나중에 이 상태로 복구해야 할 때
2. 상태를 얻는 데 필요한 직접적인 인터페이스를 두면 그 객체의 구현 세부사항이 드러날 수밖에 없고, 이것으로 객체의 캡슐화가 깨질 때
직접적인 인터페이스(Originator 내부에서 state를 받아오는 것 구현하기) 대신 Caretaker로 상태 관리
연관된 패턴은?
Command: 실행 취소가 가능한 연산의 상태를 저장할 때
Iterator: 반복 과정 상태 관리
My Opinion
어려운 패턴이 아니었다.
특정 어떤 상태가 반복되는 코드를 짤 때 메멘토를 사용하면 편할 것이고, 그렇기 때문에 메멘토 패턴은 자주 사용하게 될 것 같다.
728x90
반응형
'스터디 > 디자인 패턴' 카테고리의 다른 글
12주차. Facade (0) | 2021.08.18 |
---|---|
11주차. Builder (0) | 2021.08.11 |
9주차-2. Command (0) | 2021.07.21 |
9주차-1. Composite (0) | 2021.07.21 |
8주차-2. Iterator (0) | 2021.07.08 |
Comments