일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- tool
- Oracle
- db
- Gradle
- javascript
- laravel
- Git
- ReactJS
- JVM
- springboot
- jsp
- java
- Web Server
- jenkins
- php
- redis
- devops
- Spring Batch
- it
- 맛집
- Spring Boot
- ubuntu
- AWS
- Spring
- Design Patterns
- elasticsearch
- IntelliJ
- MySQL
- linux
- 요리
Archives
- Today
- Total
아무거나
[Design Pattern] Memento Pattern 본문
반응형
메멘토 패턴(Memento Pattern)
객체의 상태를 Memento 라고 불리는 객체에 저장했다가, 다시 꺼내서 객체의 상태를 이전의 상태로 되돌리는 패턴
- Originator: 상태값을 가지고 있는 객체
- Memento: Originator의 상태를 저장하고 있는 객체
- CareTaker: Memento를 관리해주는 관리자 역할을 함
메멘토 패턴 예시 - 1
먼저 abc라는 패키지를 생성하고 그 패키지 안에 Originator 클래스를 생성
[Originator.java]
package com.bkjeon.memento.abc;
public class Originator {
String state;
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
Memento 클래스 작성
[Memento.java]
package com.bkjeon.memento.abc;
public class Memento {
String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
}
메인클래스 작성
[Main.java]
package com.bkjeon.memento;
import com.bkjeon.memento.abc.Memento;
import com.bkjeon.memento.abc.Originator;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Memento> mementos = new Stack<>(); // CareTaker
Originator originator = new Originator();
originator.setState("state 1");
mementos.push(originator.createMemento());
originator.setState("state 2");
mementos.push(originator.createMemento());
originator.setState("state 3");
mementos.push(originator.createMemento());
originator.setState("state Final");
mementos.push(originator.createMemento());
// CareTaker에 저장했다가 꺼냈을 때
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
originator.restoreMemento(mementos.pop());
System.out.println(originator.getState());
}
}
실행결과
state Final
state 3
state 2
state 1
메멘토 패턴 예시 - 1에 protected 적용
누가 실수나 악의적으로 아래와 같이 코드를 작성했다고 하자.
...
Memento memento = originator.createMemento();
memento = new Memento("state somthing");
mementos.push(memento);
...
이렇게 외부에서 Memento를 바꿀 수 있으면 굉장히 위험해질 수 있으므로 protected로 변경하자.
[Memento.java]
package com.bkjeon.memento.abc;
public class Memento {
String state;
protected Memento(String state) {
this.state = state;
}
protected String getState() {
return this.state;
}
}
이렇게 protected로 선언하면 위의 악의적으로 작성한 코드에 에러표시가 나고 또한 아래와 같은 코드에서도 에러가 표시된다. protected는 자기가 상속받을 객체나 패키지 내에서만 접근이 가능하다.
반응형
'Java & Kotlin > Java' 카테고리의 다른 글
[Design Pattern] Proxy Pattern (0) | 2020.01.12 |
---|---|
[Design Pattern] Flyweight Pattern (0) | 2020.01.12 |
[Design Pattern] State Pattern (0) | 2020.01.10 |
[Design Pattern] Mediator Pattern (0) | 2020.01.08 |
[Design Pattern] Observer Pattern (0) | 2020.01.05 |
Comments