관리 메뉴

IT & Life

C#에서 Memento 디자인 패턴을 사용하는 방법 본문

프로그래밍/ASP.NET & C#

C#에서 Memento 디자인 패턴을 사용하는 방법

미운앙마 2017. 12. 3. 00:56

 

 

https://www.infoworld.com/article/3237793/application-development/how-to-use-the-memento-design-pattern-in-c.html#tk.ifw_nsdr_ndxprmomod

 

 

C#에서 Memento 디자인 패턴을 사용하는 방법

Memento 디자인 패턴을 활용하여 객체의 상태를 저장 및 복원하여 응용 프로그램에서 실행 취소 또는 롤백을 지원합니다.

 

 


우리는 디자인 패턴을 사용하여 일반적인 디자인 문제를 해결하고 소스 코드의 복잡성을 줄입니다. Memento 디자인 패턴은 응용 프로그램에서 실행 취소 또는 롤백 기능을 제공하거나 단순히 ASP.Net 웹 응용 프로그램에서 객체의 상태를 재설정하는 데 사용할 수있는 동작 디자인 패턴입니다. Memento라고하는 외부 위치에 객체의 상태를 저장함으로써이 패턴은 그 상태가 나중에 객체로 복원되도록합니다. C #에서 Memento 디자인 패턴을 사용하는 방법에 대해 알아 보겠습니다.

모든 객체는 내부 상태를가집니다. 메멘토 (Memento)는 캡슐화 원칙을 준수하면서 그 상태를 저장하고 복원하는 방법을 제공합니다. 캡슐화 원칙에 따라 클래스 인스턴스의 비공개 멤버가 외부 세계에 공개되어서는 안됩니다. 이는 Memento가 저장된 상태의 객체에만 사용할 수 있기 때문입니다.


Memento 디자인 패턴의 참여자에는 Memento, Originator 및 Caretaker가 포함됩니다. Memento 클래스가 객체의 상태를 저장하는 동안 Originator는 Memento를 만들고 필요시 상태를 복원하는 데 Memento를 사용합니다. Caretaker는 Memento 인스턴스를 변경하지 않아야하는 Memento 만 저장합니다.

 

 

메멘토 패턴 구현하기

 

이 섹션에서는 C #에서 Memento 디자인 패턴을 구현합니다. 우리는 Calculator클래스, Memento클래스, 그리고 클라이언트 라는 세 가지 클래스를 가진 간단한 프로그램을 만들 것 Main입니다.

 

Calculator아래 주어진 반원을 참조하십시오 .

    

 

public class Calculator
    {
        int result;
        public Calculator(int i = 0)
        {
            result = 0;
        }
        public void SetResult(int i = 0)
        {
            this.result = 0;
        }
        public void Add(int x)
        {
            result += x;
        }
        public void Subtract(int x)
        {
            result -= x;
        }
        public int GetResult()
        {
            return result;
        }
        public Memento CreateMemento()
        {
            Memento memento = new Memento();
            memento.SetState(result);
            return memento;
        }
        public void SaveState (Memento memento)
        {
            result = memento.GetState();
        }
    }

클래스 의 CreateMemento및 SetMemento메서드를 유의하십시오 Calculator. 전자가 Momento인스턴스를 작성하는 동안 인스턴스는 저장된 상태를 검색하고 값을 결과 변수에 다시 지정합니다.

 

 

메멘토 클래스

 

Memento클래스는 두 가지 방법을 포함 SetState하고 GetState. 전자는 상태 정보를 저장하는 데 사용되지만 후자는 저장된 상태를 검색하는 데 사용됩니다.

 

public class Memento
    {
        int state;
        public int GetState()
        {
            return state;
        }
        public void SetState(int state)
        {
            this.state = state;
        }
    }

이 예에서 클라이언트 Main의 인스턴스 생성 방법 Calculator클래스 및 호출하게 Add하고 Subtract계산을 수행하는 방법. 또한 메서드를 Main호출하여 특정 검사 점에 상태 정보를 저장합니다 SaveState. 나중에이 저장된 상태가 복원되고 결과 변수의 값이 콘솔 창에 표시됩니다. 이는 아래 코드 스 니펫에 설명되어 있습니다.

            

static void Main(string[] args)
        {
            Calculator calculator = new Calculator();
            calculator.Add(5);
            calculator.Add(10);
            calculator.Subtract(10);
            Memento checkPoint = calculator.CreateMemento();
            calculator.Add(100);
            Console.WriteLine(“The value of the result variable is: “+calculator.GetResult());
            calculator.SaveState (checkPoint);
            Console.WriteLine(“The value of the result variable at first checkpoint is: + calculator.GetResult());
            Console.Read();
       }

     
완전한 Memento 패턴 예제

 

당신의 참고를위한 완전한 프로그램은 여기에서있다.

 

class Program
    {
        static void Main(string[] args)
        {
            Calculator calculator = new Calculator();
            calculator.Add(5);
            calculator.Add(10);
            calculator.Subtract(10);
            Memento checkPoint = calculator.CreateMemento();
            calculator.Add(100);
            Console.WriteLine(“The value of the result variable is: “+calculator.GetResult());
            calculator.SaveState (checkPoint);
            Console.WriteLine(“The value of the result variable at first checkpoint is: + calculator.GetResult());
            Console.Read();
        }
    }

    public class Calculator
    {
        int result;
        public Calculator(int i = 0)
        {
            result = 0;
        }
        public void SetResult(int i = 0)
        {
            this.result = 0;
        }
        public void Add(int x)
        {
            result += x;
        }
        public void Subtract(int x)
        {
            result -= x;
        }
        public int GetResult()
        {
            return result;
        }
        public Memento CreateMemento()
        {
            Memento memento = new Memento();
            memento.SetState(result);
            return memento;
        }
        public void SetMemento(Memento memento)
        {
            result = memento.GetState();
        }
    }

    public class Memento
    {
        int state;
        public int GetState()
        {
            return state;
        }
        public void SetState(int state)
        {
            this.state = state;
        }
    }

  
Memento 디자인 패턴은 객체의 상태를 저장하고 검색하는 편리한 방법을 제공합니다. 이 패턴을 활용하여 실행 취소 또는 롤백을 수행 할 수 있습니다. 그러나이 패턴을 사용할 때의 단점 중 하나는 객체의 상태를 저장하고 나중에 복원하는 과정에 상당한 시간이 걸릴 수 있다는 것입니다. 즉, 응용 프로그램의 성능에 해로울 수 있습니다. 따라서 Memento 패턴을 사용할 때는 성능을 염두에 두어야합니다. 마지막으로 개체의 내부 구조가 외부 세계에 노출되지 않도록해야합니다.

Comments