JAVAにおけるオブザーバーモードの例

6270 ワード

オブザーバモードは、複数のオブジェクトが1つのオブジェクトにおけるデータの変化状況を知りたい成熟したモードである.オブザーバーモードには、「トピック」と呼ばれるオブジェクトと、「オブザーバー」と呼ばれるオブジェクトがいくつかあり、「トピック」と「オブザーバー」の間には一対多の依存関係があります.[トピック](Topics)の状態が変化すると、すべての[オブザーバー](Viewer)が通知されます.オブザーバーモードの利点:特定のトピックと特定の消去または緩和結合関係は、トピックインタフェースがオブザーバーのインタフェースに依存するだけであるため、特定のトピックは、オブザーバーインタフェースを実装するインスタンスであることを知っているだけであり、特定のクラスを知る必要はない.同様に、憂鬱な観察者はトピックインタフェースにのみ依存するため、特定の観察者は、その依存するトピックがトピックインタフェースを実現するクラスの一例であることを知っているだけであるが、特定のどのクラスの観察モードが「開閉原則」を満たすトピックインタフェースが観察者のインタフェースにのみ依存するかを知る必要はない.これにより、特定のトピックを作成するクラスも、観察者インタフェースに依存するだけにすることができます.したがって,新しいインプリメンテーションオブザーバインタフェースのクラスを追加すると,特定のトピックを作成するクラスのコードを変更する必要はない.同様に、具体的な観察者を作成するクラスはテーマインタフェースに依存するだけで、新しいテーマインタフェースを実現するクラスを追加すれば、具体的な観察者を作成するコードの例を修正する必要はありません:李さんは気象ステーションの天気予報と旅行社の毎日の旅行情報をタイムリーに知りたいと思っています.李先生は具体的な観察者で、気象ステーションと旅行社はテーマになりました.1、テーマインタフェースは具体的なテーマを実現する必要がある追加、削除及び観察者にデータを更新する方法を規定している
package org.zhy.observer.demo02.subject;

import org.zhy.observer.demo02.observer.Observer;


/**
 *   
 * @author zhengyi
 *
 */
public interface Subject {
	public void addObserver(Observer o);//     
	public void delObserver(Observer o);//     
	public void notfilyObserver();
}

2、観察者インタフェースは具体的な観察者がデータを更新する方法を規定している
package org.zhy.observer.demo02.observer;

import org.zhy.observer.demo02.subject.Subject;


/**
 *    
 * @author zhengyi
 *
 */
public interface Observer {

	public void update(Subject subject);
}

3、具体的なテーマ-』気象ステーション
package org.zhy.observer.demo02.subject.impl;

import java.util.ArrayList;

import org.zhy.observer.demo02.observer.Observer;
import org.zhy.observer.demo02.subject.Subject;

/**
 *     
 * 
 * @author zhengyi
 * 
 */
public class WeatherStation implements Subject {
	String forecastTime, forecastMess;
	int maxTemperature, minTemperature;
	ArrayList personList;
	public WeatherStation() {
		personList = new ArrayList();
	}

	@Override
	public void addObserver(Observer o) {
		if ((o != null) && (!personList.contains(o))) {
			personList.add(o);
		}
	}
	@Override
	public void delObserver(Observer o) {
		if (o != null) {
			personList.remove(o);
		}
	}
	//        
	@Override
	public void notfilyObserver() {
		for (int i = 0; i < personList.size(); i++) {
			Observer o = personList.get(i);
			o.update(this);
		}
	}
	/**
	 *    
	 * 
	 * @param t
	 * @param mess
	 * @param max
	 * @param min
	 */
	public void doForecast(String t, String mess, int max, int min) {
		this.forecastTime = t;
		this.forecastMess = mess;
		this.maxTemperature = max;
		this.minTemperature = min;
		notfilyObserver();//                  
	}

	public String getForecastTime() {
		return forecastTime;
	}

	public String getForecastMess() {
		return forecastMess;
	}

	public int getMaxTemperature() {
		return maxTemperature;
	}

	public int getMinTemperature() {
		return minTemperature;
	}
}

4、具体的なテーマ-』旅行会社
package org.zhy.observer.demo02.subject.impl;

import java.util.ArrayList;

import org.zhy.observer.demo02.observer.Observer;
import org.zhy.observer.demo02.subject.Subject;

public class TravelAgency implements Subject {

	String tourStartTime;
	String tourMess;
	ArrayList personList;
	public TravelAgency() {
		personList = new ArrayList();
	}

	@Override
	public void addObserver(Observer o) {
		if ((o != null) && (!personList.contains(o))) {
			personList.add(o);
		}
	}
	@Override
	public void delObserver(Observer o) {
		if (o != null) {
			personList.remove(o);
		}
	}
	@Override
	public void notfilyObserver() {
		for (int i = 0; i < personList.size(); i++) {
			Observer o = personList.get(i);
			o.update(this);
		}
	}

	public void giveMess(String time, String mess) {
		this.tourMess = mess;
		this.tourStartTime = time;
		notfilyObserver();
	}
	public String getTourMess() {
		return tourMess;
	}
	public String getTourStartTime() {
		return tourStartTime;
	}

}

5、具体的な観察者-』張さん
package org.zhy.observer.demo02.observer.impl;

import org.zhy.observer.demo02.observer.Observer;
import org.zhy.observer.demo02.subject.Subject;
import org.zhy.observer.demo02.subject.impl.TravelAgency;
import org.zhy.observer.demo02.subject.impl.WeatherStation;

public class Person implements Observer {

	Subject travelSubject, weatherSubject;
	String forecatsTime, forecastMess;
	int maxTemp, minTemp;
	String tourStartTime, tourMess;
	public Person(Subject travelSubject, Subject weatherSubject) {
		this.travelSubject = travelSubject;
		this.weatherSubject = weatherSubject;
		travelSubject.addObserver(this);
		weatherSubject.addObserver(this);
	}

	@Override
	public void update(Subject subject) {
		if (subject instanceof WeatherStation) {
			WeatherStation we = (WeatherStation) subject;
			forecastMess = we.getForecastMess();
			forecatsTime = we.getForecastTime();
			maxTemp = we.getMaxTemperature();
			minTemp = we.getMinTemperature();
			System.out.println("    :" + forecatsTime + "," + ",    :"
					+ forecastMess + ",    :" + maxTemp + ",    " + minTemp);
		} else if (subject instanceof TravelAgency) {
			TravelAgency tr = (TravelAgency) subject;
			tourMess = tr.getTourMess();
			tourStartTime = tr.getTourStartTime();
			System.out.println("      :" + tourStartTime + ",    :" + tourMess);
		}
	}
}

6、プログラム呼び出し
package org.zhy.observer.demo02;

import org.zhy.observer.demo02.observer.impl.Person;
import org.zhy.observer.demo02.subject.impl.TravelAgency;
import org.zhy.observer.demo02.subject.impl.WeatherStation;

public class Appliction {

	public static void main(String[] args) {
		WeatherStation we=new WeatherStation();
		TravelAgency ta=new TravelAgency();
		Person mrLi=new Person(ta, we);
		we.doForecast("10 ", "    ", 28, 20);
		ta.giveMess("10 ", "     ");
		we.doForecast("11 ", " ", 30, 15);
		ta.giveMess("11 ", "     ");
	}
}

実行結果:
観察者モードに適したシナリオ1は、1つのオブジェクトのデータ更新時に他のオブジェクトに通知する必要があるが、このオブジェクトは通知されるオブジェクトが緊密に結合することを望んでいない2、1つのオブジェクトのデータ更新時に、このオブジェクトは他のオブジェクトにも鳩に自分のデータを更新させる必要があるが、このオブジェクトは具体的にどのくらいのオブジェクトがデータを更新する必要があるか分からない