この記事では、トラフィック Java デザイン パターンのオブザーバー パターンを紹介します。このオブザーバー パターンは、オブジェクト間の 1 対多の依存関係を定義し、各オブジェクトの状態がいつ変更されるかを定義します。以下はクラス図とコード例を通して Java デザインパターンのオブザーバーパターンを紹介します。興味のある方はぜひ一緒に見てください
定義: オブジェクト間の 1 対多の依存関係を定義します。状態が変化すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。
タイプ: 行動パターン
クラス図:
ソフトウェア システムでは、このような要件がよくあります。オブジェクトの状態が変化すると、それに関連する一部のオブジェクトもそれに応じて変化に応答する必要があります。たとえば、ソフトウェアの有効領域内でマウスを右クリックするだけで、メニューがポップアップする右クリック メニュー機能を設計したいとします。別の例として、自動展開を設計したいとします。この機能は、Eclipse の開発時と同じように、ファイルが変更されている限り、Eclipse は変更されたファイルを自動的にサーバーにデプロイします。これら 2 つの関数には類似点があります。つまり、一方のオブジェクトは他方のオブジェクトを常に監視し、ステータスが変化するとすぐに対応するアクションを実行する必要があります。実際、これを実現できるソリューションは数多くありますが、オブザーバー モードの使用が主流の選択であることは間違いありません。
オブザーバー パターンの構造
最も基本的なオブザーバー パターンには、次の 4 つの役割が含まれます:
オブザーバー: クラス図からわかるように、クラス内にユーザーが存在します。 class オブザーバー オブジェクトを格納する Vector コンテナー (List の代わりに Vector が使用される理由は、Vector はマルチスレッド操作中に安全ですが、List は安全ではないためです)。この Vector コンテナーはオブザーバー クラスの中核であり、他にも 3 つあります。メソッド:attach メソッドはこのコンテナにオブザーバ オブジェクトを追加し、detach メソッドはコンテナからオブザーバ オブジェクトを削除し、notify メソッドはオブザーバ オブジェクトの対応するメソッドを順番に呼び出します。この役割は、インターフェース、抽象クラス、具象クラスのいずれかになります。他のパターンと混合されることが多いため、抽象クラスがよく使用されます。
オブザーバー: オブザーバーの役割は通常、インターフェイスです。このメソッドは、オブザーバーの状態が変化したときにトリガーされ、呼び出されます。
Specific Observable: このロールは拡張を容易にするために使用され、このロールでは特定のビジネス ロジックを定義できます。
特定のオブザーバー: オブザーバー インターフェイスの特定の実装では、監視対象オブジェクトの状態が変化したときに処理されるロジックが定義されます。
オブザーバーパターンコードの実装
abstract class Subject { private Vector<Observer> obs = new Vector<Observer>(); public void addObserver(Observer obs){ this.obs.add(obs); } public void delObserver(Observer obs){ this.obs.remove(obs); } protected void notifyObserver(){ for(Observer o: obs){ o.update(); } } public abstract void doSomething(); } class ConcreteSubject extends Subject { public void doSomething(){ System.out.println("被观察者事件反生"); this.notifyObserver(); } } interface Observer { public void update(); } class ConcreteObserver1 implements Observer { public void update() { System.out.println("观察者1收到信息,并进行处理。"); } } class ConcreteObserver2 implements Observer { public void update() { System.out.println("观察者2收到信息,并进行处理。"); } } public class Client { public static void main(String[] args){ Subject sub = new ConcreteSubject(); sub.addObserver(new ConcreteObserver1()); //添加观察者1 sub.addObserver(new ConcreteObserver2()); //添加观察者2 sub.doSomething(); } }
実行結果
観測されたイベントが反映される
オブザーバー1は情報を受信して処理します。
オブザーバー 2 は情報を受信して処理します。
実行結果から、Subject メソッドのみを呼び出していることがわかりますが、同時に 2 つのオブザーバーの関連メソッドが同時に呼び出されています。コードを詳しく見てみましょう。これは実際には非常に単純で、Subject クラスに Observer クラスを関連付け、doSomething メソッドで Observer の update メソッドを走査するだけです。オブザーバーパターンのアドバンテージinatedが観察されているオブジェクトが存在しました
? オブザーバー モードは、一般的に使用されるトリガー メカニズムであり、トリガー チェーンを形成し、各オブザーバーのメソッドを順番に処理します。しかし同時に、これはオブザーバー モードの欠点でもあり、チェーン トリガーであるため、オブザーバーが多い場合にはパフォーマンスの問題がより懸念されます。また、チェーン構造では循環参照エラーが発生しやすくなり、システムがフリーズする原因となります。
概要
Java 言語には、Observer インターフェースと、その実装クラス Observable があり、多くの場合、Observable がオブザーバーの役割を実装します。これら 2 つのクラスの使用法は、jdk API ドキュメントで確認できます。 VC++、JavaScript DOM、または AWT 開発を行った友人は皆、そのイベント処理に驚いています。オブザーバー パターンを理解すると、イベント処理メカニズムの原理をある程度理解できるようになります。イベントをトリガーする処理メカニズムの機能を設計する場合は、オブザーバー パターンを使用することをお勧めします。AWT のイベント処理 DEM (Delegation Event Model) は、オブザーバー パターンを使用して実装されます。
以上がJava デザイン パターンにおけるオブザーバー パターンの具体的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。