Presentation is loading. Please wait.

Presentation is loading. Please wait.

Memento (GOF Pattern) TP Version 1.0

Similar presentations


Presentation on theme: "Memento (GOF Pattern) TP Version 1.0"— Presentation transcript:

1 Memento (GOF Pattern) TP Version 1.0
POSA2/Dispatcher 4/27/2019 Memento (GOF Pattern) TP Version 1.0 Hyun-koo Kang Devpia A&D Eva

2 Contents Motivation 활용성 구조 참여객체 협력방법 구현관련사항 예제코드 패턴과의 연관관계 결과
POSA2/Dispatcher 4/27/2019 Contents Motivation 활용성 구조 참여객체 협력방법 구현관련사항 예제코드 패턴과의 연관관계 결과 Devpia A&D Eva

3 Motivation 객체의 내부 상태 기록 객체를 이전 상태로 복구하려면 복구할 시점의 상태 정보가 필요
POSA2/Dispatcher 4/27/2019 Motivation 객체의 내부 상태 기록 오류 복구 오퍼레이션 수행 결과를 취소하는 메커니즘 구현 객체를 이전 상태로 복구하려면 복구할 시점의 상태 정보가 필요 객체는 캡슐화를 유지하며 상태를 공개하지 않 는다. Undo 메커니즘은 ConstraintSolver클래스와 연관되어 수행되어야 하는데, ConstraintSolver클래스는 자신의 내부 상태 공개 않함 7/19/2008 Devpia A&D Eva

4 Motivation Box1 Box1 Box1’ Box2 Box2 Box2’ POSA2/Dispatcher 4/27/2019
Devpia A&D Eva

5 활용성 객체 상태를 저장한 후 나중에 이 상태로 복 구해야 할 경우
상태를 얻는 데 필요한 직접 인터페이스는 객체의 캡슐화를 위배 방지 직접 접근이 어렵거나 복잡 할 때 정보 은닉 유지

6 구조

7 참여객체 Memento(SolverState) Oringinator 객체의 내부 수식과 변수의 상태를 표현하는 자료 구조 포함
POSA2/Dispatcher 4/27/2019 참여객체 Memento(SolverState) Oringinator 객체의 내부 수식과 변수의 상태를 표현하는 자료 구조 포함 Oringinator객체를 제외한 다른 객체는 Memento클래스에 접근 안됨 Memento클래스는 두 개 인터페이스 CareTaker클래스는 Memento에 정의된 모든 인터페이스를 볼 수 없다 Originator는 자신의 상태를 복구하기 위해 Memento의 모든 자료에 접근하기 위한 인터페이스 사용 Devpia A&D Eva

8 참여객체 Originator(ConstaintSolver) Caretaker(undo mechanism)
Memento를 생성하여 현재 객체의 상태를 저장 내부 상태를 복구 및 접근 권한 소유 Memento의 다양한 인터페이스 사용 Originator만이 내부 상태에 접근 Caretaker(undo mechanism) Memento에 정의된 제한된 인터페이스 사용 Memento를 다른 객체에 전달 Memento의 보관을 책임

9 협력방법

10 협력방법 caretaker 객체는 originator객체에 memento 객체를 요청 Memento객체는 수동태
요청 시간 저장 받은 Memento객체를 다시 originator객체에게 돌려 준다. originator객체가 이전 상태로 돌아갈 필요 없을때는 memento 객체를 전달 하지 않는다. Memento객체는 수동태 Originator객체만이 memento객체 상태 정의하고 읽는다.

11 구현관련사항 Memento의 두 가지 인터페이스 Memento클래스 내부 정보 모두 공개
Friend로 선언 규정된 인터페이스를 통한 Memento클래스 접근 일반적인 클래스에서 사용 Public으로 선언

12 구현관련사항 많은 Memento객체가 생성되어야 할 때 문제 해결 방법 비용 생산성
새로 생성된 Memento객체는 바로 직전에 생성된 Memento객체에서 변경된 부분만 저장 바둑돌의 상태를 board[][]을 이용해 놓이는 좌표 값과 몇번째 수인지 대한 정보->돌의 색깔에 따라 음수와 양수로 나누어 저장 historyList를 이용하여 정보를 읽어서 돌을 놓는다.

13 예제코드 class Graphic class MoveCommand{ public: MoveCommand(Graphic* tar, const Point& delta); void Execute(); void UnExecute(); private: ConstraintSolverMemento* _state; Point _delta; Graphic* _target; };

14 예제코드 class ConstraintSolver{ public: static ConstraintSolver* Instance(); void Solve(); void AddConstraint(Graphic* startConnection, Graphic* endConnection); void Remove Constraint(Graphic* startConnection, Graphic* endConnection); ConstraintSolverMemento* CreatMemento(); void SetMemento(ConstraintSolverMemento*); };

15 예제코드 class ConstraintSolverMemento{ public: virtual ~constraintSolverMemento(); private: friend class ConstraintSolver(); //originator를 friend로 정의 //originator에게만 보여질 인터페이스 constraintSolverMemento(); };

16 예제코드 void MoveCommand::Execute(){ constraintSolver* solver = ConstraintSolver::Instance(); _state = solver->CreateMemento(); // Memento생성 _target->move(_delta); solver->solver(); } void MoveCommand::Unexecute(){ ConstraintSolver* solver=constraintSolver::Instance(); solver->SetMemento(_state);//상태복구

17 예제코드 편집기 예제 편집기는 ConstrintSolver로 부터 Memento를 요청
POSA2/Dispatcher 4/27/2019 예제코드 편집기 예제 편집기는 ConstrintSolver로 부터 Memento를 요청 ConstraintSolver는 Memento를 생성해서 반환 ConstraintSolverMemento는 ConstraintSolver의 내부 수식과 변수의 상태를 표현하는 자료 구조를 포함 사용자가 이동 오퍼레이션을 취소할 때 편집기는 ConstraintSolverMemento 를 ConstrintSolver클래스에게 제공 ConstraintSolverMemento 정보를 바탕으로 ConstraintSolver는 이전 상태로 정확하게 반환하기 위해 내부 구조를 변경 Devpia A&D Eva

18 패턴과의 연관관계 Originator 객체의 내부가 다른 객체에 의해 직접적으로 영향을 받지 않게 경계
Client가 스스로 자신이 원하는 시점의 Originator객체 상태 정보를 Memento객체 를 이용해 저장,관리 Memento객체의 생성은 Originator객체의 내부 상태를 모두 복사해야 하는 비용 Memento객체의 저장,관리,삭제는 Client에 서 수행

19 패턴과의 연관관계 Command Pattern과 함께 사용 Iterator Pattern
작업을 취소하고자 할 때 수행되기 이전 상태로 쉽게 복귀할 수 있게 도와준다. Iterator Pattern Iterator클래스 내부에서 현재 항목의 위치 정보를 저장, 관리하는 목적으로 사용

20 결과 캡슐화된 경계를 유지 할 수 있다. Originator클래스를 단순화 할 수 있다.
Originator만 memento를 다룰 수 있기 때문에 memento는 외부에 노출되지 않는다. Originator클래스를 단순화 할 수 있다. 특정 목적에 맞게 originator를 구성하여 비용 및 개발 시간을 줄일 수 있다.


Download ppt "Memento (GOF Pattern) TP Version 1.0"

Similar presentations


Ads by Google