자바 디자인 모드 의 모니터 모드 인 스 턴 스 상세 설명

본 논문 의 사례 는 자바 디자인 모델 의 모니터 모델 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
모니터 모델 은 세 가지 요소 가 있 는데 그것 이 바로 사건 원,사건 대상,모니터 이다.
이벤트 소스:말 그대로 사건 발생 의 원천,예 를 들 어 클릭 한 버튼 은 감청 대상 에 속 합 니 다.
사건 대상:이것 은 사건 원 과 자주 헷 갈 리 고 사건 원 을 포장 하 는 데 자주 사용 된다.기억 하 세 요.이것 은 사건 이기 때 문 입 니 다.예 를 들 어 사건 원 을 클릭 하면 사건 원 과 자신의 느낌 을 구별 하고 나무 에 밤 이 있 습 니 다.
모니터:이것 은 모니터 모드 의 핵심 입 니 다.이벤트 발생 후의 동작 을 정의 합 니 다.보통 이벤트 대상 은 모니터 에서 정의 하 는 함수 로 참 여 됩 니 다.
다음은 간단 한 밤 을 들 어 보 겠 습 니 다.
이야기 의 배경 은 샤 오 밍 이 위생 을 중시 하지 않 는 아이 라 서 그의 어머니는 그의 건강 을 매우 걱정 하고 식사 전에 손 을 씻 어야 한다 고 규정 하고 있다.
곰 아 이 를 정의 하 다.곰 아 이 는 감청 대상 이 고 사건 의 근원 이 며 모든 사건 이 사건 의 근원 이다.이것 은 쓸데없는 말 인 것 같다.

public class Child {
  private String name;
  private RemindListener remindListener;
  public Child(String name){
    this.name = name;
  }
  public void eat() {
    if(null!=remindListener){
      remindListener.remind(new RemindWashingHandsEvent(this));
    }
    System.out.println("Child eat...");
  }
  public void addListener(RemindListener listener){
    remindListener = listener;
  }
}

다음은 사건 대상 을 살 펴 보 자.사건 대상 은 위 에서 말 한 것 처럼 사건 원 을 포장 했다.우 리 는 식사 전에 손 씻 는 사건 을 정의 한다.

public class RemindWashingHandsEvent {
  private Child child;
  public RemindWashingHandsEvent(Child child){
    this.child = child;
  }
}

이벤트 대상 은 이벤트 의 속성,상 태 를 정의 합 니 다.
이 어 사건 발생 을 정의 한 후 감청 기의 동작 으로 손 씻 기 를 알 린 다.

public class RemindListener {
  public void remind(RemindWashingHandsEvent remindWashingHandsEvent){
    System.out.println("listen to mom, washing hands before eating...");
  }
}

주의 하 세 요.모니터 는 주로 동작 을 봉 인 했 습 니 다.그것 뿐 입 니 다.
상기 코드 는 모니터 모델 의 원 리 를 설명 하기 위해 서 입 니 다.코드 가 통속 적 이 고 우아 하지 않 습 니 다.
다음은 자바 표준 라 이브 러 리 를 계승 하거나 실현 하 는 김 에 코드 한 쌍 을 썼 습 니 다.밤 이 깊 었 으 니 시간 이 있 으 면 다시 설명 하 겠 습 니 다.

public class Kid{
  private String name;
  private List<Listener> liteners;
  public Kid(String name) {
    this.name = name;
    this.liteners = Lists.newArrayList();
  }
  public void eat(){
    for(Listener listener:liteners){
      if(listener instanceof WashingHandsListener){
        WashingHandsListener washingHandsListener = (WashingHandsListener) listener;
        washingHandsListener.fireAfterEventInvoked(new WashingHandsEvent(this,"  "));
      }
    }
    System.out.println("  ...");
  }
  public void addListener(Listener listener){
    liteners.add(listener);
  }
}
public class Event extends EventObject {
  /**
   * Constructs a prototypical Event.
   *
   * @param source The object on which the Event initially occurred.
   * @throws IllegalArgumentException if source is null.
   */
  public Event(Object source) {
    super(source);
  }
}
public class WashingHandsEvent extends Event{
  private String eventName;
  /**
   * Constructs a prototypical Event.
   *
   * @param source The object on which the Event initially occurred.
   * @throws IllegalArgumentException if source is null.
   */
  public WashingHandsEvent(Object source,String eventName) {
    super(source);
    this.eventName = eventName;
  }
  public String getEventName() {
    return eventName;
  }
  public void setEventName(String eventName) {
    this.eventName = eventName;
  }
}
public interface Listener extends java.util.EventListener{
  public void fireAfterEventInvoked(Event event);
}
public class WashingHandsListener implements Listener{
  @Override
  public void fireAfterEventInvoked(Event event) {
    WashingHandsEvent washingHandsEvent = (WashingHandsEvent) event;
    System.out.println("    "+ washingHandsEvent.getEventName());
  }
}
public class Test {
  public static void main(String[] args) {
    Kid xiaoming = new Kid("xiaoming");
    xiaoming.addListener(new WashingHandsListener());
    xiaoming.eat();
  }
}

출력 결과:

더 많은 자바 관련 내용 에 관심 이 있 는 독 자 는 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기