23デザインパターン第13章:Javaオブザーバーパターン
定義:オブジェクト間の1対多くの依存関係を定義するため、各オブジェクトが状態を変更すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。
タイプ:行動パターン
クラス図:
多くの場合、ソフトウェアシステムには必要があります。オブジェクトの状態が変更された場合、それに関連する一部のオブジェクトもそれに応じて変更されます。
たとえば、右クリックメニュー関数を設計する必要があります。ソフトウェアの効果的な領域を右クリックしている限り、メニューがポップアップします。
たとえば、ファイルが変更されている限り、Eclipseが開発されたときと同じように、自動展開機能を設計する必要があります。Eclipseは、変更されたファイルをサーバーに自動的に展開します。
これら2つの関数の間には類似性があります。つまり、1つのオブジェクトは常に別のオブジェクトを監視する必要があり、その状態が変化する限り、対応するアクションが必要になります。実際、これを達成できる多くのソリューションがありますが、オブザーバーモデルを使用することは間違いなく主流の選択です。
オブザーバーパターンの構造
最も基本的なオブザーバーモードでは、次の4つの文字が含まれています。
オブザーバー:クラス図から、クラスには、オブザーバーオブジェクトを保存するベクトルコンテナがクラスにあることがわかります(リストの代わりにベクトルを使用する理由は、
スレッドの場合、ベクトルは安全ですが、リストは安全ではありません)、このベクトルコンテナはオブザーバークラスのコアであり、他には3つの方法があります。アタッチ方法は、このコンテナにオブザーバーオブジェクトを追加することです。デタッチ方法は、容器からオブザーバーオブジェクトを削除することです。 Notifyメソッドは、オブザーバーオブジェクトの対応する方法を順番に呼び出すことです。この役割は、多くの場合、他のパターンと混合されるため、インターフェイス、抽象クラス、または具体的なクラスである可能性があるため、抽象クラスを使用するケースが増えます。
オブザーバー:オブザーバーの役割は一般にインターフェイスであり、更新方法は1つしかありません。オブザーバーの状態が変更されると、この方法は呼び出されます。
特定のオブザーバー:この役割は簡単に拡大するために使用され、特定のビジネスロジックをこの役割で定義できます。
特定のオブザーバー:オブザーバーインターフェイスの特定の実装。この役割では、観測されているオブジェクトの状態が変化するときに処理されるロジック。
オブザーバーモードコードの実装
パブリックアブストラクトクラスの件名{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(); } Public Class ConcreTesubjectはsubjectを拡張します{public void dosomeThing(){system.out.println( "オブザーバーイベントによって返されます"); this.notifyobserver(); }}パブリックインターフェイスオブザーバー{public void update(); } Public Class ConcreteteObserver1はObserverを実装します{public void update(){System.out.println( "Observer 1がメッセージを受信して処理します。"); }} public class concreteobserver2を実装します{public void update(){system.out.println( "Observer 2がメッセージを受信して処理する。"); }} public class client {public static void main(string [] args){subject sub = new concretesubject(); sub.addobserver(new concreteteobserver1()); // Observer1 sub.addobserver(new concreteteobserver2())を追加します。 // observer2 sub.dosomething()を追加します。 }}実行結果
オブザーバーイベントは逆転し、オブザーバー1は情報を受け取り、処理します。
オブザーバー2は情報を受け取り、処理します。
実行結果を通じて、サブジェクトメソッドのみを呼び出すことがわかりますが、両方のオブザーバーの関連する方法が同時に呼び出されます。コードを慎重に見ると、実際には非常に簡単です。これは、件名クラスでオブザーバークラスを関連付け、dosomhing方法でオブザーバーアップデート方法を通過するだけではありません。
オブザーバーモードの利点
オブザーバーとオブザーバーはわずかに関連しており、抽象的に結合されているため、両方を拡張する方が簡単です。
オブザーバーモードは、一般的に使用されるトリガーメカニズムであり、トリガーチェーンを形成し、各オブザーバーのメソッドを順番に処理します。しかし同時に、これはオブザーバーモードの欠点でもあります。チェーンでトリガーされているため、多くのオブザーバーがいる場合、パフォーマンスの問題はより心配です。さらに、チェーン構造では、円形の参照エラーが発生する可能性が高く、システムが偽造されます。
要約します
Java言語には、インターフェイスオブザーバーとその実装クラスが観察可能であり、しばしばオブザーバーの役割を実装します。 JDK APIドキュメントで、これら2つのクラスの使用方法を表示できます。
VC ++、JavaScript DOM、またはAWT開発を行った友人はすべて、イベント処理について驚くべきものです。オブザーバーのパターンを理解した後、彼らはイベント処理メカニズムの原則を特定の理解を持っています。処理メカニズムをトリガーするイベントの関数を設計したい場合、オブザーバーモードを使用することが良い選択です。 AWTのイベント処理DEM(委任イベントモデル)は、オブザーバーモードを使用して実装されます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。