[자바 디자인 패턴] 행동패턴 - 메멘토 패턴

2021. 3. 15. 17:28 JAVA/Design Patterns

행동패턴 목록

 

상태를 저장하고 복원하는 기능이 필요한 경우에 사용하면 유용할 듯 하다.

 

장점

 - 캡슐화 경계를 유지합니다.

 - 발신자를 단순화합니다.

 

사용시기

 - 실행 취소 작업을 구현하는데에 쓰입니다.

 - 대부분의 소프트웨어에서 실행취소 및 재실행 작업에 사용됩니다.

 - 데이터베이스 트랜잭션에도 사용됩니다.

 

UML

 

Memento Class : Memento

 - 발신자 객체의 내부 상태를 저장합니다. 상태는 여러 상태 변수를 포함할 수 있습니다.

 - Memento에는 관리인에 대한 인터페이스인 두개의 인터페이스가 있어야 합니다. 이 인터페이스는 메멘토가 저장한

   내부 상태에 대한 작업이나 액세스를 허용해서는 안되므로 캡슐화를 유지해야 합니다. 다른 인터페이스는 Originator

   이며 Originator는 작성자가 이전 상태를 복원하는 데 필요한 상태변수에 액세스 할 수 있도록 합니다.

public class Memento {  
    private String state;  
  
    public Memento(String state) {  
        this.state=state;  
    }  
    
    public String getState() {  
        return state;  
    }  
}

 

Originator Class : Originator

 - Originator의 내부상태를 캡쳐할 Memento 오브젝트를 생성합니다.

 - Memento 오브젝트를 사용하여 이전상태를 복원합니다.

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();  
    }  
}

 

Caretaker Class : Caretaker

 - Memento를 유지할 책임이 있습니다.

 - Memento는 Caretaker에 투명하며 Caretaker가 Memento를 조작하지 않아야 합니다. (유지만)

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);  
    }  
}

 

Operation Class : MementoPatternDemo

public class MementoPatternDemo {  
    public static void main(String[] args) {  
        // 객체 생성
        Originator originator = new Originator();  
        Caretaker careTaker = new Caretaker();  
        
        // 상태설정 및 복원시점 추가
        originator.setState("State #1");  
        careTaker.add(originator.saveStateToMemento());  
        
        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());  
        
        originator.getStateFromMemento(careTaker.get(2));  
        System.out.println("Third saved State: " + originator.getState());  
    }  
}

 

 

출처 : https://www.javatpoint.com/

know-one-by-one.tistory.com/56