디자인 모드 13: 상태 모드

2532 단어
상태 모드 (State DP) 는 대상 이 내부 상태 가 바 뀔 때 행동 을 바 꿀 수 있 도록 합 니 다. 마치 클래스 가 바 뀐 것 처럼 (원문: Allow an object to alter its behavior when its internal state changes. The object will appeared to change its class).상태 모드 하면 전략 모드 를 제시 하지 않 을 수 없다.둘 다 실행 할 때 행 위 를 바 꿀 수 있 습 니 다. 다른 것 은 전략 모델 은 사용자 가 임시로 선택 한 것 이 고 상태 모델 은 사용자 가 이전에 정 의 된 상태의 전환 이 며 실행 할 때 정 해진 상태 기 에 따라 전환 을 수행 합 니 다.물론 수 동 으로 상 태 를 제어 하지 않 으 면 이 두 모델 은 확실히 비슷 하 다.
코드: State 인터페이스:
/**
 * 
 * State interface.
 * 
 */
public interface State {

  void onEnterState();

  void observe();

}

매머드:
/**
 * 
 * Mammoth has internal state that defines its behavior.
 * 
 */
public class Mammoth {

  private State state;

  public Mammoth() {
    state = new PeacefulState(this);
  }

  /**
   * Makes time pass for the mammoth
   */
  public void timePasses() {
    if (state.getClass().equals(PeacefulState.class)) {
      changeStateTo(new AngryState(this));
    } else {
      changeStateTo(new PeacefulState(this));
    }
  }

  private void changeStateTo(State newState) {
    this.state = newState;
    this.state.onEnterState();
  }

  @Override
  public String toString() {
    return "The mammoth";
  }

  public void observe() {
    this.state.observe();
  }
}

분노 모드:
/**
 * 
 * Angry state.
 *
 */
public class AngryState implements State {

  private static final Logger LOGGER = LoggerFactory.getLogger(AngryState.class);

  private Mammoth mammoth;

  public AngryState(Mammoth mammoth) {
    this.mammoth = mammoth;
  }

  @Override
  public void observe() {
    LOGGER.info("{} is furious!", mammoth);
  }

  @Override
  public void onEnterState() {
    LOGGER.info("{} gets angry!", mammoth);
  }

}

평온 모드:
/**
 * 
 * Peaceful state.
 *
 */
public class PeacefulState implements State {

  private static final Logger LOGGER = LoggerFactory.getLogger(PeacefulState.class);

  private Mammoth mammoth;

  public PeacefulState(Mammoth mammoth) {
    this.mammoth = mammoth;
  }

  @Override
  public void observe() {
    LOGGER.info("{} is calm and peaceful.", mammoth);
  }

  @Override
  public void onEnterState() {
    LOGGER.info("{} calms down.", mammoth);
  }

}

테스트:
public static void main(String[] args) {

    Mammoth mammoth = new Mammoth();
    mammoth.observe();
    mammoth.timePasses();
    mammoth.observe();
    mammoth.timePasses();
    mammoth.observe();

  }

좋은 웹페이지 즐겨찾기