프로그래밍 기술/Escort GoF의 디자인 패턴

21. 메멘토 패턴(Memento Pattern) [Escort GoF의 디자인 패턴]

언제나휴일 2016. 4. 4. 15:11
반응형

21. 메멘토 패턴(Memento Pattern)

 

21.1 개요

 

 메멘토 패턴은 개체의 상태를 기록해 놓았다가 원래 상태로 복원을 할 필요가 있을 때 기록해 놓은 것을 사용되는 패턴입니다. 메멘토 패턴은 실행 취소 기능을 지원하고자 할 때 많이 사용됩니다.

 

 간단한 예를 들어볼께요. 어떤 응용에서 특정 기능을 수행할 것을 요청하기 전에 원본 개체에게 메멘토 개체를 요청합니다. 원본 개체는 자신의 상태 정보에 대한 스냅샷인 메멘토 개체를 생성하여 반환합니다. 그리고 특정 기능을 수행하다가 수행 이전 상태로 복원이 필요하게 되면 반환 받았던 메멘토 개체를 원본 개체에게 전달하여 복원할 것을 요청합니다. 원본 개체는 전달받은 메멘토 개체에 보관해 두었던 이전 상태 값을 얻어와서 자신의 상태를 복원을 하는 것입니다.

 

 메멘토 패턴을 사용할 경우 원본이 될 수 있는 형식에서만 메멘토 개체의 속성을 설정 및 얻어올 수 있게 해 주어 높은 신뢰성을 추구할 수 있습니다. 이를 고려하지 않는다면 메멘토 개체로 인해 원본 개체에 대한  캡슐화를 위배하는 것과 같은 현상이 발생할 수 있습니다.

 

 

 

 

 

 

21. 2 시나리오

 

 2주가 지나면 중간 고사 기간이 시작됩니다. 제가 맡는 강의는 정규 과목이 아니라서 중간 고사와 기말 고사 기간에는 진행하지 않습니다. 보통 이 기간을 이용하여 장거리 여행을 가곤 하지요. 이번에는 추석이나 구정에만 방문하는 고향에 여행을 가기로 하였고 오늘 3시 비행기로 출발합니다.

 

 제주도로 가는 비행기에서 혁재와 영상 처리에 대한 이런 저런 얘기를 나눴습니다. 혁재는 요즘 사진 보정하는 응용을 제작 중이라고 하더군요.

 

 "혁재야. 언제면 우리가 사용할 수 있을까?"

 "아빠, 지금도 사용할 수는 있어요. 그런데, 보정 작업을 하다가 원상 복구를 하는 게 안 되고 있어서 사용하기 전에 원본을 복사한 후에 보정하고 있어요. 또 다시 보정하려면 다시 작업을 반복해야 하다 보니 사용하기는 좀 불편한 거 같아요."

 

 ". 작업하기 전 파일을 보관했다가 복원하는 기능을 추가하면 되지 않을까? 지난 번에 준 [Escort GoF의 디자인 패턴] 책을 보면 메멘토 패턴에 대한 소개가 있을 거야. 한 번 살펴보렴문제 해결에 도움이 될거야."

 

 일주일 동안 고향 제주를 여행을 하는 마지막 날에 혁재의 프로그램을 사용해 볼 수 있었어요.


메멘토 패턴



AboutMemento.zip

//common.h

#pragma once

 

#pragma warning (disable:4996)

#include <iostream>

 

using std::cout;

using std::endl;

#include <vector>

using std::vector;

#include <string>

using std::string;

 

#include <iomanip>

using std::ios;

#include <algorithm>

 

#pragma warning(disable:4482)

 

//Snapshot.h

#pragma once

 

class Snapshot

{

             friend class Picture;

             int tone;

             int brightness;

             int saturation;

             Snapshot(int tone,int brightness,int saturation)

             {

                           this->tone = tone;

                           this->brightness = brightness;

                           this->saturation = saturation;

             }

             int GetTone()const

             {

                           return tone;

             }

             int GetBrightness()const

             {

                           return brightness;

             }

             int GetSaturation()const

             {

                           return saturation;

             }

            

};

 

//Picture.h

#pragma once

#include "Common.h"

#include "Snapshot.h"

class Picture

{

             string name;

             int tone;

             int brightness;

             int saturation;

public:

             Picture(string name,int tone,int brightness,int saturation);               

             void Change(int tone,int brightness,int saturation);           

             void View()const;

             Snapshot *MakeSnapshot();

             void SetBySnapshot(Snapshot *snapshot);

};

 

//Picture.cpp

#include "Picture.h"

 

Picture::Picture(string name,int tone,int brightness,int saturation)

{

             this->name = name;

             this->tone = tone;

             this->brightness = brightness;

             this->saturation = saturation;

}

 

void Picture::Change(int tone,int brightness,int saturation)

{

             this->tone += tone;

             this->brightness += brightness;

             this->saturation += saturation;

}

 

void Picture::View()const

{

             cout<<"사진 파일 :"<<name<<endl;

             cout<<"    색조:"<<tone<<" 명도:"<<brightness<<" 채도:"<<saturation<<endl;

}

Snapshot *Picture::MakeSnapshot()

{

             return new Snapshot(tone,brightness,saturation);

}

void Picture::SetBySnapshot(Snapshot *snapshot)

{

             this->tone = snapshot->GetTone();

             this->brightness = snapshot->GetBrightness();

             this->saturation = snapshot->GetSaturation();     

}

 

//App.h

#pragma once

 

#include "Picture.h"

class App

{

             Picture *picture;

             Snapshot *snapshot;

public:

             App(Picture *picture);

             void SetPicture(Picture *picture);        

             void Change(int tone,int brightness,int saturation);

             void Cancel();

             void End();

             ~App(void);

private:

             void Start();

};

 

//App.cpp

#include "App.h"

 

App::App(Picture *picture)

{

             snapshot = 0;

             SetPicture(picture);

}

 

App::~App(void)

{

             End();

}

void App::SetPicture(Picture *picture)

{

             End();

             cout<<endl<<"사진을 설정합니다."<<endl;

             this->picture = picture;        

             Start();

}

 

void App::Start()

{

             picture->View();

             snapshot = picture->MakeSnapshot(); 

}

void App::Change(int tone,int brightness,int saturation)

{

             picture->Change(tone,brightness,saturation);

             picture->View();

}

void App::Cancel()

{

             if(snapshot)

             {

                           picture->SetBySnapshot(snapshot);     

             }

             End();     

}

void App::End()

{

             if(snapshot)

             {                         

                           picture->View();

                           delete snapshot;

             }

             snapshot = 0;       

            

}

 

//Demo.cpp

#include "App.h"

int main()

{

             Picture *picture = new Picture("천호지의 들풀",100,100,100);

             Picture *picture2 = new Picture("외도가는 ",100,100,100);

             App *app = new App(picture);

                          

             app->Change(10,20,-20);                               

             app->Change(10,20,-20);    

             app->Cancel();

                          

             app->SetPicture(picture2);   

             app->Change(10,20,-20);                               

             app->Change(10,20,-20);    

             app->End();

             

             delete app;           

             delete picture;

             return 0;

}


IT 전문가로 가는 길 Escort GoF의 디자인 패턴
국내도서
저자 : 장문석
출판 : 언제나휴일 2013.04.01
상세보기


 

반응형