메모 모드


메멘토 패턴은 객체의 특정 상태를 저장하여 적절한 시점에 객체를 복원할 수 있도록 합니다. 메모 모드는 행동 모드입니다.

Introduction

의도: 객체의 내부 상태를 캡처하고 캡슐화를 파괴하지 않고 이 상태를 객체 외부에 저장합니다.

주요 솔루션: 메모 모드는 개체의 내부 상태를 캡처하고 캡슐화를 파괴하지 않고 이 상태를 개체 외부에 저장하여 나중에 개체를 원래 저장된 상태로 복원할 수 있도록 하는 것입니다.

사용 시기: 항상 개체의 내부 상태를 기록해야 하는 경우가 많습니다. 이 작업의 목적은 사용자가 불확실하거나 잘못된 작업을 취소하고 원래 상태로 복원하여 "후회"하도록 하는 것입니다. 약" "먹을 수 있어요.

해결 방법: 메모 클래스를 통해 객체 상태를 특별히 저장합니다.

키 코드: 클라이언트는 메모 클래스와 결합되지 않고 메모 관리 클래스와 결합됩니다.

적용예: 1. 후회약. 2. 게임을 하는 동안 파일을 저장하세요. 3. Windows에서는 ctri + z. 4. IE로 돌아갑니다. 4. 데이터베이스 트랜잭션 관리.

장점: 1. 사용자에게 상태 복원 메커니즘을 제공하여 사용자가 더 편리하게 특정 과거 상태로 돌아갈 수 있도록 합니다. 2. 사용자가 상태를 저장하는 세부 사항에 신경 쓸 필요가 없도록 정보 캡슐화가 실현됩니다.

단점: 자원 소비. 클래스에 멤버 변수가 너무 많으면 필연적으로 상대적으로 큰 리소스를 차지하게 되며 저장할 때마다 일정량의 메모리가 소비됩니다.

사용 시나리오: 1. 데이터를 저장/복원해야 하는 관련 상태 시나리오. 2. 롤백 작업을 제공합니다.

주의 사항: 1. Dimit 원칙을 준수하려면 관리 메모 클래스를 추가해야 합니다. 2. 메모리 절약을 위해 프로토타입 모드 + 메모 모드를 사용할 수 있습니다.

3개의 클래스

Memento

, OriginatorCareTaker를 사용하여 메모 패턴을 구현합니다. Memento에는 복원할 개체의 상태가 포함되어 있습니다. Originator는 Memento 객체에 상태를 생성하고 저장합니다. Caretaker 객체는 Memento에서 객체의 상태를 복원하는 일을 담당합니다.

MementoPatternDemo, 데모 클래스에서는 CareTakerOriginator 개체를 사용하여 개체의 상태 복원을 표시합니다.

memento_pattern_uml_diagram.jpg

1단계

메멘토 클래스를 만듭니다.

Memento.java

public class Memento {
   private String state;

   public Memento(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }	
}

2단계

Originator 클래스를 생성합니다.

Originator.java

public class Originator {
   private String state;

   public void setState(String state){
      this.state = state;
   }

   public String getState(){
      return state;
   }

   public Memento saveStateToMemento(){
      return new Memento(state);
   }

   public void getStateFromMemento(Memento Memento){
      state = Memento.getState();
   }
}

3단계

CareTaker 클래스를 생성합니다.

CareTaker.java

import java.util.ArrayList;
import java.util.List;

public class CareTaker {
   private List<Memento> mementoList = new ArrayList<Memento>();

   public void add(Memento state){
      mementoList.add(state);
   }

   public Memento get(int index){
      return mementoList.get(index);
   }
}

4단계

CareTakerOriginator 개체를 사용합니다.

MementoPatternDemo.java

public class MementoPatternDemo {
   public static void main(String[] args) {
      Originator originator = new Originator();
      CareTaker careTaker = new CareTaker();
      originator.setState("State #1");
      originator.setState("State #2");
      careTaker.add(originator.saveStateToMemento());
      originator.setState("State #3");
      careTaker.add(originator.saveStateToMemento());
      originator.setState("State #4");

      System.out.println("Current State: " + originator.getState());		
      originator.getStateFromMemento(careTaker.get(0));
      System.out.println("First saved State: " + originator.getState());
      originator.getStateFromMemento(careTaker.get(1));
      System.out.println("Second saved State: " + originator.getState());
   }
}

5단계

출력을 확인합니다.

rreee