작심삼일

10주차. Memento 본문

스터디/디자인 패턴

10주차. Memento

yun_s 2021. 7. 28. 21:38
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