技術共有

デザインパターン - オブザーバーパターン

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. オブザーバーパターンの核となる考え方

Observer パターンは、Publish/Subscribe パターンとも呼ばれます。 GOF はオブザーバー パターンを次のように定義します。 オブジェクト間の 1 対多の依存関係を定義し、複数のオブザーバー オブジェクトが同時に同じオブジェクトにフォーカスできるようにします。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが変化します。自動的に通知され、更新されます。
以下の図に示すように、オブザーバー パターンには 5 種類のオブジェクトが含まれています。
ここに画像の説明を挿入します

  • ターゲットインターフェース件名: ターゲットインターフェイスは、オブザーバーの追加attach()、オブザーバー削除detach()、オブザーバー通知notifyObservers()の3つのインターフェイスを定義し、独自の操作関数operation()を定義します。
  • 抽象ターゲットクラスAbstractSubject: このクラスは、追加されたオブザーバー オブジェクトのリストを保存するために使用されるオブザーバーのコレクション オブジェクト vect を定義し、更新する 3 つの関数を実装します: add Observerattach()、delete Observer detach()、およびnotifyObservers() このリストもすべてのオブザーバー オブジェクトに自身を更新するように通知します。
  • 特定のターゲット クラス MySubiect: 抽象ターゲット クラス AbstractSubiect から継承し、operation() を実装する特定の操作関数を記述します。この関数では、notifyObservers() を呼び出して、すべてのオブザーバーに自身を更新するように通知できます。
  • オブザーバーインターフェース オブザーバー: ターゲット クラスが変更されたときに通知する必要があるオブジェクトの統一インターフェイス update() を定義します。
  • コンクリートオブザーバー : Observer1 や Observer2 などの複数のオブザーバー オブジェクトを定義して、統合された更新関数を記述することができます。クライアント テストは、オブザーバー Observer を Subject クラスに追加することで監視を実装できます。

具体的な実装を見てみましょう。

(1) オブザーバインタフェース Observer.java は、統一された更新インタフェース update() を定義します。そのソースコードを次のプログラムに示します。

package behavior.observer;


/**
* @author Minggg
* 观察者接口
*/
public interface Observer {

	public void update();
}

(2) オブザーバ実装クラス Observer1.java はオブザーバの具体的な実装であり、その更新関数を使用してコンソールに文字列を出力します。そのソースコードを次のプログラムに示します。

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer1 implements Observer {

	public void update(){ 
		System.out.println("观察者1得到通知!");
	}
}

(3) オブザーバ実装クラス Observer2.java は別のオブザーバの固有実装であり、その更新関数を使用してコンソールに文字列を出力します。そのソースコードを次のプログラムに示します。

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer2 implements Observer {

	public void update(){ 
		System.out.println("观察者2得到通知!");
	}
}

(4) 監視対象インタフェース Subject.java は、オブザーバを操作するための 3 つのインタフェース関数を定義し、独自の関数を表す特定の操作関数インタフェースを定義します。そのソースコードを次のプログラムに示します。

package behavior.observer;


/**
* @author Minggg
* 被观察者接口
*/
public interface Subject {

	// 增加观察者
	public void attach(Observer observer);
	// 删除观察者
	public void detach(Observer observer);
	// 通知所有观察者
	public void notifyObservers();
	// 自身的操作接口
	public void operation();
}

(5) 観測される抽象クラス AbstractSubject.java は、すべての観測オブジェクトを保存し、リスト オブジェクトを操作するための実装関数を記述するためのベクトル リスト vect を提供します。そのソースコードを次のプログラムに示します。

package behavior.observer;

import java.util.Enumeration;
import java.util.Vector;


/**
* @author Minggg
* 被观察者抽象类
*/
public abstract class AbstractSubject implements Subject {

	private Vector