第2の書き込みモードオブザーバは、それがこのオブザーバ・モードになると、昨年ソフトウェア設計ソフトのテスト最後の質問は、このオブザーバテストモードなので、印象は、かなり深いです、この本の第二章です。
コンセプト
オブジェクトの状態が変化したときオブザーバーモデルは、なるように、多くのオブジェクト間の依存関係を定義し、その扶養家族のすべてが通知され、自動的に更新されます。
例ショー
三つの部分、気象局(実際の物理デバイスの気象データ取得)、WeatherDataのオブジェクトで構成され(気象局から追跡データ、及び掲示板を更新する)システム及び掲示板(見るために、ユーザに現在の気象条件を表示)を行う必要があり。
この例では、WeatherData物理オブジェクトが更新されたデータを得るために、どのように気象観測所との接触を知っています。現在の状況(温度、湿度、気圧)、気象統計情報と天気予報:WeatherDataオブジェクトは、ディスプレイ3枚の看板を更新します。
私たちの目標は、データを使用してアプリケーションを構築することですWeatherDataオブジェクトを取得し、その後、3件の掲示板を更新します。
この方法は、以下のWeatherDataクラスを備えます。
getTemplate()
getHumidity()
getPressure()
measuermentsChanged()
我々はmeasurementChanged()メソッドを実現する必要があります
- 新しい測定データの準備ができると、このメソッドが呼び出されます
- 新しい測定データ、3枚の看板はすぐに更新する必要がありますWeatherData
- ビルドカスタム掲示板に、他の開発者は、ユーザーが任意の掲示板、既存の3件の掲示板、現在の状況、気象統計情報と天気予報の掲示板を追加または削除することができますので、このシステムは、スケーラブルでなければなりません。
エラーモデル
まず、エラーああを実証します
public class WeatherData {
/**
* 目前状况布告板
*/
CurrentConditionDisplay currentConditionDisplay;
/**
* 气象统计布告板
*/
ForecastDisplay forecastDisplay;
/**
* 天气预报布告板
*/
StatisticsDisplay statisticsDisplay;
float temperature;
float humidity;
float pressure;
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
public float getTemperature() {
return temperature;
}
public void measurementsChanged() {
float temperature = getTemperature();
float humidity = getHumidity();
float pressure = getPressure();
currentConditionDisplay.update(temperature, humidity, pressure);
statisticsDisplay.update(temperature, humidity, pressure);
forecastDisplay.update(temperature, humidity, pressure);
}
}
measurementsChanged()メソッドで掲示板を更新し、いくつかのインスタンスを宣言し、クラス、データが更新された、掲示板を更新するには、このメソッドを呼び出します。
しかし、大規模なこのアプローチの欠点は、あなたが削除またはプログラム必見の掲示板を変更すると、将来的に特定の増加を達成するようにプログラムされています。確かにあまりにもリソース集約、および繰り返しコードを変更する必要性で設計されていませんこれはそう。
修正
今、私たちはその後、被験者は何である、「オブザーバーモード= +テーマオブザーバー」、話題に話すことができ、観察者は何ですか?
テーマは、データの変更があった場合、最初の時間は、オブジェクトのテーマは、ビューアオブジェクトをお知らせします、監視センターと同等のオブジェクト管理データです。
オブザーバオブジェクトは、データの変更があった場合、データは、更新の対象を受信する、トピックに登録されています。読者の手に渡さ公表新しいニュース、新聞印刷された新聞の必要性があるときには、新聞と読者の関係に似ています。これは、オブジェクトが変更されたとき、他の扶養に通知され、多くの関係です。
原則を設計します。オブジェクトとワークとの疎結合の相互作用を設計するために。
オブザーバオブジェクトの場合、視聴者が唯一のインターフェース(オブザーバーインタフェース)の主題を知って実現し、被験者は、観察者が行って具体的なクラス、またはその他の詳細が誰であるかを知る必要はありません。視聴者が任意に増減するが、影響を受けることはありませんができます。新しいオブザーバー、修正することなく、対象コードがある場合、あなたは何をする必要がある新しいクラスで、このオブザーバインタフェースを実装して、オブザーバーとして登録されています。
Observerパターンは、それらが相互作用することができますが、詳細を知らない、対象と観察者が疎結合させることです。変更のいずれか2が疎結合されているとして、それらの両方の間で、他には影響しませんが、あまりにも長い間、それらの間のインタフェースはまだ観測されているように、我々はそれらを変更するのは自由です。
そして、特定のバーコードを見ます。
コードの実装例
名前が示すように最初の3つのインタフェース、すなわちDisplayElement、オブザーバーと件名3つのインタフェースは、掲示板の最初のディスプレイインターフェース、第2のインターフェースは、更新データに視聴者インタフェースは、第3のインタフェースでありますオブザーバーを登録するためのテーマインターフェース。
public interface DisplayElement {
public void display();
}
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
public interface Subject {
public void registerObserver(Observer observer);
}
我々は前に述べた次は、それがテーマですので、オブザーバー・データの更新を通知する必要性に起因するWeatherDataクラスは、あなたは、件名インターフェイスは、観察者のコレクションが含まれている実装する必要があります。
public class WeatherData implements Subject {
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
int i = observers.indexOf(observer);
if (i >= 0) {
observers.remove(observer);
}
}
public void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {
Observer observer = (Observer) observers.get(i);
observer.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();
}
}
同時に天気オブジェクトを構築すると、観察者がコンテナオブジェクトを登録するために使用空のセットを、インスタンス化しながら、残りの3つのプロパティは、属性の看板を必要としている、オブザーバーオブザーバーのコレクションです。
registerObserver(観察オブザーバ)メソッドは、オブザーバーを登録する方法であって、共感removeObserver(観察オブザーバ)オブザーバメソッドを除去することです。
notifyObservers()メソッドは、データの更新、measurementsChanged(のコレクションを視聴者に通知することである)は、前述の方法でデータを更新することです。
setMeasurements(フロート温度、フロート湿度、フロート圧力)(フロート温度、フロート湿度、フロート圧力)方法の3つの属性を設定することで、measurementsChanged呼び出し中()メソッドは、データ・アナウンス・ボードを更新します。
そして、掲示板CurrentConditionsDisplayクラスがあります。これは、オブザーバーインターフェイスを実装し、オブジェクトは、達成するための2つのインターフェイスメソッドをテーマ登録を渡す必要があるとき、実装インタフェースは、テーマオブジェクト、初期化されたインスタンスが含まれています。
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);
}
@Override
public void display() {
System.out.println("Current conditions: " + temperature +
"F degrees and " + humidity + "% humidity");
}
@Override
public void update(float temp, float humidity, float pressure) {
this.temperature = temp;
this.humidity = humidity;
display();
}
}
最後に、テストクラス。
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(80,65, 30.4f);
}
}
テーマオブジェクトを作成し、掲示板のオブジェクトを作成すると、データ対象オブジェクトによって更新され、コンソールを表示するには、データの掲示板から出力します。
これは明確な対多の構成であり、一方の組は、複数のオブジェクトの一方が、そこにあります。データのニーズを更新するとき、2つの疎結合後になるの一連のアクションのメソッドを呼び出して、あなただけの実装オブザーバーインタフェースは、そのオブジェクトをテーマに登録することができるという新しいクラスを作成する必要があり、新たな掲示板を追加したいです。
次のデザインパターンは明日続けます。