디자인 모델 학습 --- 2. 관찰자 모델

5157 단어 디자인 모드
관찰자 모드 정의:
대상 간 의 한 쌍 이상 의 의존 관 계 를 정의 합 니 다.대상 의 상태 가 바 뀌 면 그 대상 에 의존 하 는 모든 대상 이 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
Subject: 대상
한 목표 대상 에 여러 관찰자 가 관찰 하고 있다.
관찰자 추가 및 삭제 유지 보수 제공
목표 가 변 했 을 때 모든 관찰자 에 게 알 립 니 다.
Observer: 관찰자 의 인터페이스, 목표 알림 을 제공 할 때 대응 하 는 업데이트 방법
Concrete Subject: 구체 적 인 목표 대상
Concrete Observer: 구체 적 인 관찰자 대상
Subject 클래스:
package com.light.com;

import java.util.ArrayList;
import java.util.List;

public class Subject {
	private List<Observer> observers = new ArrayList<Observer>();

	public void attach(Observer o) {
		observers.add(o);
	}

	public void detach(Observer o) {
		observers.remove(o);
	}

	protected void notifyObservers() {
		for (Observer o : observers) {
			o.update(this);
		}
	}
}

Observer 인터페이스:
package com.light.com;

public interface Observer {
	//    
   public void update(Subject subject);
}

Concrete Subject 클래스:
package com.light.com;

public class ConcreteSubject extends Subject {
	//    
	private String news;

	public String getNews() {
		return news;
	}

	public void setNews(String news) {
		this.news = news;
		System.out.println("     ,     ");
		this.notifyObservers();
	}

}

ConcreteObserver 클래스:
package com.light.com;

public class ConcreteObserver implements Observer {
    private String name;
    
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void update(Subject subject) {
		//     
         System.out.println(name+"     ,   :"+((ConcreteSubject)subject).getNews());
	}

}

클 라 이언 트:
package com.light.com;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	   ConcreteSubject paper = new ConcreteSubject();
	   ConcreteObserver reader1 = new ConcreteObserver();
       reader1.setName("  ");
       ConcreteObserver reader2 = new ConcreteObserver();
       reader2.setName("  ");
       ConcreteObserver reader3 = new ConcreteObserver();
       reader3.setName("    ");
       paper.attach(reader1);
       paper.attach(reader2);
       paper.attach(reader3);
       paper.setNews("    ");
       System.out.println("--------------");
       paper.setNews("     ");
	}

}

실행 결과:
염탐꾼 이 돌 아 왔 습 니 다. 중요 한 소식 이 있 습 니 다. 손 권 은 소식 을 들 었 습 니 다. 내용 은 조조 가 유비 에 도착 해서 소식 을 들 었 습 니 다. 내용 은 조조 가 직전 신장 에 도착 해서 소식 을 들 었 습 니 다. 내용 은 조조 가 도 착 했 습 니 다.조조 가 돌 아 갔 어 요.
절 차 를 분석 해 보 자. 만약 에 한 탐정 이 3 자 통수권 자의 군령 을 가지 고 있다 고 가정 하면 새로운 소식 이 있 으 면 바로 자신의 정보 고 를 업데이트 하고 모든 통수권 자의 정보 창고 에 업데이트 가 있다 고 알려 준다. 빨리 와 서 보 자. 통수권 자 는 모두 탐정 의 인용 이 있어 관찰 하기 쉽다.정보 창고 가 업데이트 되면 통 수 는 이 인용 에 따라 탐정 이 업데이트 한 최신 정 보 를 볼 수 있다.감독 은 탐정 에 게 정 보 를 얻 는 데 의존 하지만 탐정 은 사령관 에 게 의존 하지 않 는 다. 예 를 들 어 탐정 은 어떤 통수권 자의 월급 이 낮 아 졌 다 고 생각 하고 일 을 도와 주지 않 으 려 면 이 통수권 자 를 제거 하고 제거 한 통수권 자 도 정 보 를 얻 을 수 없다.감독 은 항상 수 동적 으로 탐정 이 정 보 를 보답 할 때 까지 기다린다.
일반적으로 우 리 는 JAVA 에서 관찰자 모델 을 실현 합 니 다. 시스템 이 제공 하 는 2 가지 종류의 Observable 류 와 Observer 류 만 계승 하면 됩 니 다. 다른 작업 시스템 은 이미 우 리 를 도와 포장 되 었 습 니 다.
Concrete Subject 클래스
package com.light.com;

public class LingLingQi extends java.util.Observable {
	private String news;

	public String getNews() {
		return news;
	}

	public void setNews(String news) {
		this.news = news;
		//          
		this.setChanged();
		//                    ,          ,                    
		this.notifyObservers(news);
		//             ,    
//		this.notifyObservers();
		
	}

}

ConcreteObserver 클래스
package com.light.com;

import java.util.Observable;

public class General implements java.util.Observer {
    private String name;
    
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void update(Observable o, Object arg) {
		System.out.println(name+"     :"+arg);
	}

}

클 라 이언 트 클 라 이언 트
package com.light.com;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	  LingLingQi l = new LingLingQi();
	  General wuTian = new General();
	  wuTian.setName("    ");
	  General shangShan = new General();
	  shangShan.setName("    ");
	  General yiDa = new General();
	  yiDa.setName("    ");
	  l.addObserver(wuTian);
	  l.addObserver(shangShan);
	  l.addObserver(yiDa);
	  l.setNews("    ");
	  System.out.println("------   ");
	  l.setNews("      ");
	}

}

실행 결과:
이다 정종 은 소식 을 들 었 다: 신 장 은 상 삼 겸 신 을 끊 었 다 소식 을 들 었 다: 신 장 은 무전 신 현 을 끊 었 다 소식 을 들 었 다: 신 장 은 끊 었 다 - 며칠 후에 이다 정종 은 소식 을 들 었 다: 우 차이 수 길이 왔 다 상 삼 겸 신 은 소식 을 들 었 다: 우 차이 수 길이 왔 다 우 다 신 현 은 소식 을 들 었 다: 우 차이 수 길이 왔 다
안 드 로 이 드 의 각종 사건 감청 은 관찰자 모델 을 사 용 했 습 니 다. 한 관찰자 가 여러 개의 목표 대상 을 관찰 한 것 은 마치 통수권 자가 여러 개의 프로 브 를 보 낸 것 과 같 습 니 다. 모든 프로 브 는 서로 다른 인 터 페 이 스 를 통 해 통수권 자 에 게 정보 에 변화 가 생 겼 음 을 알 립 니 다.

좋은 웹페이지 즐겨찾기