20. 메멘토 패턴(Memento Pattern) 구현

20.4 구현

메멘토 패턴에 대한 예제 프로그램을 구현하는 순서는 Snapshot, Picture, App와 데모 코드 순으로 하겠습니다.

20.4.1 Snapshot

Snapshot 형식에서는 사진의 색조, 명도, 채도 정보를 얻어오는 속성을 노출하고 설정하는 속성은 은폐할 것입니다. 설정하는 속성을 은폐하는 이유는 신뢰성을 높이기 위해 다른 형식 개체에서 이들에 대한 값을 변경하지 못하도록 하기 위해서 입니다.

▶ Snapshot.cs

namespace Memento
{
    class Snapshot
    {
        public int Tone
        {
            get;
            private set;
        }
        public int Brightness
        {
            get;
            private set;
        }
        public int Saturation
        {
            get;
            private set;
        }
        public Snapshot(int tone, int brightness, int saturation)
        {
            Tone = tone;
            Brightness = brightness;
            Saturation = saturation;
        }
    }
}

20.4.2 Picture

Picture 형식에서는 사진의 색조, 명도, 채도 정보를 변경하거나 상태 정보를 볼 수 있게 합시다. 그리고, 자신의 상태 정보에 대한 Snapshot 개체를 생성을 해 주는 메서드와 Snapshot 개체에 보관된 정보로 자신의 상태 정보를 변경하는 메서드를 제공하세요.

Picture에서 Snapshot 개체를 사용하지 않고 색조나 명도, 채도 정보를 얻어오고 설정하는 속성을 제공을 한다면 사용하는 곳에서 잘못된 사용을 할 수도 있습니다. 하지만, Picture 개체를 통해 자신의 상태와 동일한 상태 값을 갖는 Snapshot 개체를 만들어주고 이를 통해 자신의 속성을 변경하게 함으로써 잘못된 사용을 막을 수 있습니다.

 ▶ Picture.cs

using System;
namespace Memento
{
    class Picture
    {
        string name;
        int tone;
        int brightness;
        int saturation;
        public Picture(string name,int tone,int brightness,int saturation)
        {
            this.name = name;
            this.tone = tone;
            this.brightness = brightness;
            this.saturation = saturation;
        }
        public void Change(int tone,int brightness,int saturation)
        {
            this.tone += tone;
            this.brightness += brightness;
            this.saturation += saturation;
        }
        public void View()
        {
            Console.WriteLine("사진 파일명:{0}",name);
            Console.WriteLine("    색조:{0} 명도:{1} 채도:{2}",tone,brightness,saturation);
        }
        public Snapshot MakeSnapshot()
        {
            return new Snapshot(tone,brightness,saturation);
        }
        public void SetBySnapshot(Snapshot snapshot)
        {
            this.tone = snapshot.Tone;
            this.brightness = snapshot.Brightness;
            this.saturation = snapshot.Saturation;
        }
    }
}

20.4.3 App

App 클래스에서는 설정된 사진에 대해 어떠한 작업을 시작할 때 사진의 Snapshot을 보관해 두고 작업이 취소되면 보관해 두었던 Snapshot으로 복원을 하고 작업이 정상적으로 종료되면 Snapshot을 버리게 할 것입니다.

그리고 데모 코드에서는 두 개의 사진 개체를 생성하여 하나는 응용을 통해 정보를 변경을 하다 취소를 요청하여 복원한다는 것을 보여주고 하나는 정보를 변경하여 작업 완료를 하는 것을 보여주려고 합니다.

 ▶ App.cs

using System;
namespace Memento
{
    class App
    {
        Picture picture;
        Snapshot snapshot = null;
        public App(Picture picture)
        {            
            SetPicture(picture);
        }

        public void SetPicture(Picture picture)
        {
            End();
            Console.WriteLine("사진을 설정합니다.");
            this.picture = picture;	
            Start();
        }
        void Start()
        {
            picture.View();
            snapshot = picture.MakeSnapshot();	
        }
        public void Change(int tone,int brightness,int saturation)
        {
            picture.Change(tone,brightness,saturation);
            picture.View();
        }
        public void Cancel()
        {
            if(snapshot!=null)
            {
                picture.SetBySnapshot(snapshot);	
            }
            End();	
        }
        public void End()
        {
            if(snapshot!=null)
            {		
                picture.View(); 
            }
            snapshot = null;	
        }
    }
}

▶ Program.cs

namespace Memento
{
    class Program
    {
        static void Main(string[] args)
        {
            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();	
        }
    }
}

▶ 실행 결과

사진을 설정합니다.
사진 파일 명:천호지의 들풀
    색조:100 명도:100 채도:100
사진 파일 명:천호지의 들풀
    색조:110 명도:120 채도:80
사진 파일 명:천호지의 들풀
    색조:120 명도:140 채도:60
사진 파일 명:천호지의 들풀
    색조:100 명도:100 채도:100

사진을 설정합니다.
사진 파일 명:외도가는 길
    색조:100 명도:100 채도:100
사진 파일 명:외도가는 길
    색조:110 명도:120 채도:80
사진 파일 명:외도가는 길
    색조:120 명도:140 채도:60
사진 파일 명:외도가는 길
    색조:120 명도:140 채도:60