디자인 모드 학습 노트(14) 비망록

4975 단어
본 문서의 인스턴스 코드:https://github.com/JamesZBL/java_design_patterns
의사록 모드(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());

  }

}


총결산


이 예를 통해 비망록 모델의 주요 특징은 다음과 같다.
캡처된 객체의 원래 상태를 수정하지 않고 객체의 내부 상태를 캡처하여 해당 객체와 독립적인 객체에 캡처된 객체의 상태를 저장합니다.따라서 정적 내부 클래스를 스냅샷 보존의 실현으로 사용해야 한다. 왜냐하면 대상의 상태와 대상은 직접적으로 긴밀한 관계가 없고 상대적으로 독립적인 관계가 있기 때문이다.
상태 보유자의 데이터가'포획 대상'을 제외한 대상에게 접근되지 않도록 상태 보유자의 클래스를'포획 대상 클래스'의 사유 클래스로 정의해야 한다.
많은 소프트웨어에서 현재 작업 진행 상황을 저장하는 기능이 필요하기 때문에 이것이 바로 비망록 모드의 사용 장면이다.
  • 게임 소프트웨어의 아카이브
  • 워드 프로세싱 소프트웨어(예: MS Office)에서 "이전 단계 취소"작업
  • 브라우저의 이전 페이지로 돌아가기
  • 데이터베이스에서의 사무 스크롤
  • 매번 저장 상태와 복구 상태가 메모리 자원을 많이 소모하는 것을 피하기 위해 비망록 모드와 이전 글에서 언급한 원형 모드를 결합하여 사용할 수 있다.
    개인 블로그 동시 업데이트, 더 많은 기술 공유 주목: 정보락의 블로그

    좋은 웹페이지 즐겨찾기