디자인 모델 의 내용 관찰자 모델

9128 단어
1. 관찰자 모드 정의
       대상 간 의 다 중 의존 을 정의 합 니 다. 그러면 대상 이 상 태 를 바 꿀 때 모든 의존 자 는 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
2. 관찰자 모드 도표:
3. 관찰자 모델 의 자기 이해:
  (1) < 인터페이스 > > Observer: 관찰자 가 업데이트 한 조작 인 터 페 이 스 를 정의 합 니 다.
  (2) < interface > > Subject: 대상 의 등록, 로그아웃, 알림 데이터 업 데 이 트 를 정의 하 는 세 개의 인터페이스
   (3) ConcreteObserver 클래스 는 주로 < < interface > > Observer 의 업데이트 작업 을 실 현 했 습 니 다.
   (4) Concrete Subject 류, 우 리 는 관리 류 라 고도 할 수 있 습 니 다. 주로 < 인터페이스 > Subject 가 정의 한 등록, 로그아웃 과 데이터 업 데 이 트 를 알 리 는 세 개의 인 터 페 이 스 를 실 현 했 습 니 다. 그 중의 관건 적 인 변수 - list < Concrete Observer > concrete Observer 입 니 다. 이 변 수 는 주로 모든 관찰자 에 게 관 리 를 하고 데이터 가 바 뀌 었 을 때 모든 관찰 자 를 옮 겨 다 니 는 것 입 니 다.상응하는 조작 을 하 다.
4. 나의 작은 예:
   이 예 는 Head First 디자인 모델 (중국어 버 전) 이라는 책의 마지막 애플 릿 입 니 다. 저 는 안 드 로 이 드 에서 이 루어 졌 습 니 다.이 예 는 내 가 버튼 을 클릭 할 때 두 명의 관찰자 가 있다 는 것 이다. 한 관찰자 (천사) 는 '친, 나 는 천사 다. 나 는 당신 의 클릭 에 대해 나의 대답 은: 사랑 해!!' 라 고 말 할 것 이다.또 다른 관찰자 (악마) 는 친, 나 는 악마 입 니 다. 나 는 당신 의 클릭 에 대해 나의 대답 은: 나 는 당신 을 미워 합 니 다!!
   이 예 에서 나 는 단일 모델, 관찰자 모델 을 응용 했다.
(1)<>Observer:
public interface IClickListernObserver {
	public void onClickToUpdate();
}

(2) ConcreteObserver 클래스 --- AngelObserver:
public class AngelObserver implements IClickListernObserver {
	
	private static AngelObserver instance;
	
	private IAngelClickLister myIAngelClickLister;
	
	public AngelObserver(){
		ClickListerManager.getInstance().registerObserver(this);
	}

	
	public static AngelObserver getInstance(){
		if(instance == null)
			instance = new AngelObserver();
		return instance;
	}
	
	public void setMyIAngelClickLister(IAngelClickLister myIAngelClickLister){
		this.myIAngelClickLister = myIAngelClickLister;
	}
	
	@Override
	public void onClickToUpdate() {
		// TODO Auto-generated method stub
		myIAngelClickLister.onClickAngelDo();
	}
	
	public interface IAngelClickLister{
		public void onClickAngelDo();		
	}
	
}

(3) ConcreteObserver 클래스 --- DevilObserver:
public class DevilObserver implements IClickListernObserver {
	
	private static DevilObserver instance;
	
	private IDevilClickLister myIDevilClickLister;
	
	public DevilObserver(){
		ClickListerManager.getInstance().registerObserver(this);
	}

	
	public static DevilObserver getInstance(){
		if(instance == null)
			instance = new DevilObserver();
		return instance;
	}
	
	public void setMyIDevilClickLister(IDevilClickLister myIDevilClickLister){
		this.myIDevilClickLister = myIDevilClickLister;
	}
	
	@Override
	public void onClickToUpdate() {
		// TODO Auto-generated method stub
		myIDevilClickLister.onClickDevilDo();
	}
	
	public interface IDevilClickLister{
		public void onClickDevilDo();		
	}	
	
}

(4)<>Subject:
public interface Subject {
	public void registerObserver(IClickListernObserver o);
	public void unRegisterObserver(IClickListernObserver o);
	public void notifyObservers();
}

(5) Concrete Subject 클래스:
import java.util.ArrayList;
import java.util.List;

public class ClickListerManager implements Subject {
	
	private static ClickListerManager instance;
	
	private List<IClickListernObserver> observers;

	public ClickListerManager(){
		observers = new ArrayList<IClickListernObserver>();
	}
	
	public static ClickListerManager getInstance(){
		if(instance == null)
			instance = new ClickListerManager();
		return instance;
	}
	
	public void notifyAllItem(){
		notifyObservers();
	}
	
	@Override
	public void registerObserver(IClickListernObserver object) {
		// TODO Auto-generated method stub
		if(!observers.contains(object)){
			observers.add(object);					
		}	
	}

	@Override
	public void unRegisterObserver(IClickListernObserver object) {
		// TODO Auto-generated method stub
		if(observers.contains(object)){
			observers.remove(object);				
		}		
	}

	@Override
	public void notifyObservers() {
		// TODO Auto-generated method stub
		for(int i = 0;i < observers.size();i++){
			observers.get(i).onClickToUpdate();
		}
	}
}

(6) ContentObserver Activity 클래스:
import com.example.testcontentobserver01.AngelObserver.IAngelClickLister;
import com.example.testcontentobserver01.DevilObserver.IDevilClickLister;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class ContentObserverActivity extends Activity implements OnClickListener,
											IAngelClickLister, IDevilClickLister{
	
	private Button myButton;
	private TextView myTextViewAngel;
	private TextView myTextViewDevil;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_content_observer);	
		init();	
		myButton = (Button) findViewById(R.id.myButton);
		myButton.setOnClickListener(this);		
		myTextViewAngel = (TextView) findViewById(R.id.myTextViewAngel);
		myTextViewDevil = (TextView) findViewById(R.id.myTextViewDevil);
	}

	private void init() {
		// TODO Auto-generated method stub
		AngelObserver.getInstance();
		AngelObserver.getInstance().setMyIAngelClickLister(this);
		DevilObserver.getInstance();
		DevilObserver.getInstance().setMyIDevilClickLister(this);
	}

	@Override
	public void onClick(View view) {
		// TODO Auto-generated method stub
		int id = view.getId();
		switch(id){
			case R.id.myButton:
				ClickListerManager.getInstance().notifyAllItem();			
		}
	}

	@Override
	public void onClickAngelDo() {
		// TODO Auto-generated method stub
		myTextViewAngel.setText(" ,    ,       ,     :   !!");
	}

	@Override
	public void onClickDevilDo() {
		// TODO Auto-generated method stub
		myTextViewDevil.setText(" ,    ,       ,     :   !!");
	}

}

5. 기상 감 측 응용
   이 예 는 Head First 디자인 모델 (중국어 판) 이라는 책의 설명 사례 이기 도 하 다. 이 예 는 현재 세 개의 디 스 플레이 장치 가 있 는데 하 나 는 기상 관측소 의 온 도 를 표시 하고 하 나 는 습 도 를 표시 하 며 하 나 는 기압 을 표시 하 며 이 세 개의 데이터 가 바 뀌 었 을 때 세 개의 디 스 플레이 장 치 를 실시 간 으로 업데이트 하고 나중에 디 스 플레이 장 치 를 추가 하 는 데 편리 해 야 한다.
   해결 방안 은 관찰자 모드 입 니 다.
  (1) 도표:
(2)interface Subject:
public interface Subject{
  public void registerObserver(Observer o);
  public void removeObserver(Observer o);
  public void notifyObservers();
}

(3)interface Observer:
public interface Observer{
  public void update(float temp,float humidity,float pressure);
}

(4)interface DisplayElement:
public interface DisplayElement{
  public void display();
}

(5) WeatherData 클래스:
public class WeatherData implements Subject{
  private ArrayList observers;
  private float temperature;
private float humidity;
private float pressure;

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

public void removeObserver (Observer o){
  int i = observers.indexOf(o);
  if(i >= 0){
    observers.remove(i);
  }
}

public void notifyObservers (){
  for(int i = 0; i < observers.size(); i++ ){
Observer observers = (Observer)observers.get(i);
observers.update(temperature, humidity, pressure);
}
}

public void measurementsChanged(){
  notifyObservers();
}

public void setMeasurements(float temperature, float humidity, float pressure){
  this. temperature = temperature;
  this. humidity = humidity;
  this. pressure = pressure;
  measurementsChanged();
}
………………….
}

(6) 클래스 전류 조건 표시:
public class CurrentConditionsDisplay implements Observer, DisplayElement{
  private float temperature;
  private float humidity;
  private Subject weatherData;

public CurrentConditionsDisplay(Subject weatherData){
  this. weatherData = weatherData;
  weatherData. registerObserver(this);
}

public void update(float temperature, float humidity, float pressure){
  this. temperature = temperature;
  this. humidity = humidity;
  display();
}

public void display(){
  System.out.println(“Current conditions:” + temperature + “F degrees and ” + humidity + “% humidity”);
}
}

(7) 이와 유사 한 것 은 Statistics Display, ForecastDisplay 두 가지 생략 을 실현 할 수 있 습 니 다.
(8) 테스트 클래스:
public class WeatherStation{
  public static void main(String[] args){
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); 
ForecastDisplay forecastDisplay = new ForecastDisplay (weatherData); 

weatherData. setMeasurements(80,65,30.4f);
weatherData. setMeasurements(70,75,31.4f);
weatherData. setMeasurements(90,55,32.4f);
  }
}

참고 자료: 1.http://blog.csdn.net/hfreeman2011/article/details/8308873
2. Head First 디자인 모델 (중국어 판), 중국 전력 출판사 출판, O 'REILLY 회사 번역 - (39 - 78 쪽) 관찰자 모델

좋은 웹페이지 즐겨찾기