디자인 모드 학습 노트(14) 비망록
의사록 모드(Memento), 스냅샷 모드(Snapshot)라는 별칭이 있는 비헤이비어 모드의 일종입니다.그것의 주요 특징은 특정한 대상을 만들어서 다른 몇 개의 대상이 어느 순간에 있는 상태를 보존함으로써 이 상태를 필요로 할 때 제때에 회복할 수 있도록 하는 것이다.
인스턴스
한 알의 씨앗이 파종되고 싹이 돋고 꽃이 피기까지 오랜 시간이 걸린다. 비록 우리는 육안으로 그것이 자라는 것을 알 수 없지만, 그것은 확실히 시시각각 자란다.식물의 생장 과정 중의 매 순간의 상태는 완전히 같지 않기 때문에 우리는 식물의 몇 가지 상태를 스냅샷으로 보존할 수 있다.
우리는 식물학적으로 여러 가지 미시적인 상태를 고려하지 않기 때문에 식물을 간단하게 정의한다. 식물의 상태는 높이와 무게로 구성되고 식물은 서로 다른 생장 단계를 구분한다.
Plant.java
public interface Plant {
int getWeight();
int getHeight();
FlowerType getType();
}
꽃류Flower
를 정의하면 식물Plant
의 인터페이스를 실현하여 그 생장 과정 중 어느 순간의 상태를 얻고 꽃이 자랄 수 있다. 생장 과정을 모의하기 위해 우리는 성장 속도 계산 공식을 사용자 정의하고 매번 growing
방법을 사용하면 꽃의 단계를 아래로 이동시킨다. 예를 들어 꽃이 씨앗 단계에 있을 때한 번 자라면 꽃봉오리의 단계에 처한다.
꽃의 성장을 시뮬레이션하는 방법:
public void growing() {
setWeight(getWeight() * 2);
setHeight(getHeight() * 3);
switch (type) {
case SEED: {
setType(FlowerType.BURGEON);
break;
}
case BURGEON: {
setType(FlowerType.BUD);
break;
}
case BUD: {
setType(FlowerType.BLOOM);
break;
}
case BLOOM: {
setType(FlowerType.DEAD);
setHeight(0);
setWeight(0);
break;
}
default:
break;
}
}
꽃류에서 개인적인 정적 내부류FlowerMemento
를 정의하는데 이 종류는 꽃의 생장 상태를 기록한다.
private static class FlowerMemento implements Plant {
private FlowerType type;
private int height;
private int weight;
private FlowerMemento(FlowerType type, int height, int weight) {
this.type = type;
this.height = height;
this.weight = weight;
}
@Override
public int getWeight() {
return weight;
}
@Override
public int getHeight() {
return height;
}
@Override
public FlowerType getType() {
return type;
}
}
꽃의 성장 단계를 매거류로 정의합니다.
FlowerType.java
public enum FlowerType {
SEED(" "), BURGEON(" "), BUD(" "), BLOOM(" "), DEAD(" ");
private String name;
FlowerType(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
이러한 클래스 간의 관계를 쉽게 정리하기 위해 현재 완전한Flower
클래스를 제시합니다.
Flower.java
public class Flower implements Plant {
private FlowerType type;
private final String name;
private int height;
private int weight;
public void growing() {
//
}
FlowerMemento getMemento() {
return new FlowerMemento(getType(), getHeight(), getWeight());
}
void setMemento(Plant plant) {
FlowerMemento flowerMemento = (FlowerMemento) plant;
setType(flowerMemento.getType());
setHeight(flowerMemento.getHeight());
setWeight(flowerMemento.getWeight());
}
@Override
public String toString() {
return String.format(" :%s\t :%s\t :%d \t :%d ", getName(), getType(), getWeight(), getHeight());
}
public Flower(FlowerType type, String name, int height, int weight) {
this.type = type;
this.name = name;
this.height = height;
this.weight = weight;
}
// getter & setter ...
private static class FlowerMemento implements Plant {
private FlowerType type;
private int height;
private int weight;
private FlowerMemento(FlowerType type, int height, int weight) {
this.type = type;
this.height = height;
this.weight = weight;
}
// getter & setter ...
}
}
마지막으로 꽃의 생장 과정을 시뮬레이션해 보자.
App.java
public class Application {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
Flower flower = new Flower(FlowerType.SEED, " ", 1, 2);
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
}
}
총결산
이 예를 통해 비망록 모델의 주요 특징은 다음과 같다.
캡처된 객체의 원래 상태를 수정하지 않고 객체의 내부 상태를 캡처하여 해당 객체와 독립적인 객체에 캡처된 객체의 상태를 저장합니다.따라서 정적 내부 클래스를 스냅샷 보존의 실현으로 사용해야 한다. 왜냐하면 대상의 상태와 대상은 직접적으로 긴밀한 관계가 없고 상대적으로 독립적인 관계가 있기 때문이다.
상태 보유자의 데이터가'포획 대상'을 제외한 대상에게 접근되지 않도록 상태 보유자의 클래스를'포획 대상 클래스'의 사유 클래스로 정의해야 한다.
많은 소프트웨어에서 현재 작업 진행 상황을 저장하는 기능이 필요하기 때문에 이것이 바로 비망록 모드의 사용 장면이다.
public interface Plant {
int getWeight();
int getHeight();
FlowerType getType();
}
public void growing() {
setWeight(getWeight() * 2);
setHeight(getHeight() * 3);
switch (type) {
case SEED: {
setType(FlowerType.BURGEON);
break;
}
case BURGEON: {
setType(FlowerType.BUD);
break;
}
case BUD: {
setType(FlowerType.BLOOM);
break;
}
case BLOOM: {
setType(FlowerType.DEAD);
setHeight(0);
setWeight(0);
break;
}
default:
break;
}
}
private static class FlowerMemento implements Plant {
private FlowerType type;
private int height;
private int weight;
private FlowerMemento(FlowerType type, int height, int weight) {
this.type = type;
this.height = height;
this.weight = weight;
}
@Override
public int getWeight() {
return weight;
}
@Override
public int getHeight() {
return height;
}
@Override
public FlowerType getType() {
return type;
}
}
public enum FlowerType {
SEED(" "), BURGEON(" "), BUD(" "), BLOOM(" "), DEAD(" ");
private String name;
FlowerType(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public class Flower implements Plant {
private FlowerType type;
private final String name;
private int height;
private int weight;
public void growing() {
//
}
FlowerMemento getMemento() {
return new FlowerMemento(getType(), getHeight(), getWeight());
}
void setMemento(Plant plant) {
FlowerMemento flowerMemento = (FlowerMemento) plant;
setType(flowerMemento.getType());
setHeight(flowerMemento.getHeight());
setWeight(flowerMemento.getWeight());
}
@Override
public String toString() {
return String.format(" :%s\t :%s\t :%d \t :%d ", getName(), getType(), getWeight(), getHeight());
}
public Flower(FlowerType type, String name, int height, int weight) {
this.type = type;
this.name = name;
this.height = height;
this.weight = weight;
}
// getter & setter ...
private static class FlowerMemento implements Plant {
private FlowerType type;
private int height;
private int weight;
private FlowerMemento(FlowerType type, int height, int weight) {
this.type = type;
this.height = height;
this.weight = weight;
}
// getter & setter ...
}
}
public class Application {
private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
Flower flower = new Flower(FlowerType.SEED, " ", 1, 2);
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
flower.growing();
LOGGER.info(flower.toString());
}
}
이 예를 통해 비망록 모델의 주요 특징은 다음과 같다.
캡처된 객체의 원래 상태를 수정하지 않고 객체의 내부 상태를 캡처하여 해당 객체와 독립적인 객체에 캡처된 객체의 상태를 저장합니다.따라서 정적 내부 클래스를 스냅샷 보존의 실현으로 사용해야 한다. 왜냐하면 대상의 상태와 대상은 직접적으로 긴밀한 관계가 없고 상대적으로 독립적인 관계가 있기 때문이다.
상태 보유자의 데이터가'포획 대상'을 제외한 대상에게 접근되지 않도록 상태 보유자의 클래스를'포획 대상 클래스'의 사유 클래스로 정의해야 한다.
많은 소프트웨어에서 현재 작업 진행 상황을 저장하는 기능이 필요하기 때문에 이것이 바로 비망록 모드의 사용 장면이다.
개인 블로그 동시 업데이트, 더 많은 기술 공유 주목: 정보락의 블로그
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.