定義:オブジェクト間の1対多くの依存関係を定義するため、各オブジェクトが状態を変更すると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。
タイプ:行動パターン
クラス図:
多くの場合、ソフトウェアシステムには必要があります。オブジェクトの状態が変更された場合、それに関連する一部のオブジェクトもそれに応じて変更されます。たとえば、右クリックメニュー関数を設計する必要があります。ソフトウェアの効果的な領域を右クリックしている限り、メニューがポップアップします。たとえば、ファイルが変更されている限り、Eclipseが開発されたときと同じように、自動展開機能を設計する必要があります。Eclipseは、変更されたファイルをサーバーに自動的に展開します。これら2つの関数の間には類似性があります。つまり、1つのオブジェクトは常に別のオブジェクトを監視する必要があり、その状態が変化する限り、対応するアクションが必要になります。実際、これを達成できる多くのソリューションがありますが、オブザーバーモデルを使用することは間違いなく主流の選択です。
オブザーバーパターンの構造
最も基本的なオブザーバーモードでは、次の4つの文字が含まれています。
オブザーバー:クラス図から、クラスには、オブザーバーオブジェクトを保存するベクトルコンテナがクラスにあることがわかります(リストの代わりにベクトルが使用される理由は、マルチスレッド操作の場合、ベクトルが安全であり、リストは安全でないためです)。このベクトルコンテナは、オブザーバークラスのコアです。他に3つの方法があります。添付の方法は、このコンテナにオブザーバーオブジェクトを追加することです。デタッチ方法は、容器からオブザーバーオブジェクトを削除することです。 Notifyメソッドは、オブザーバーオブジェクトの対応する方法を順番に呼び出すことです。この役割は、多くの場合、他のパターンと混合されるため、インターフェイス、抽象クラス、または具体的なクラスである可能性があるため、抽象クラスを使用するケースが増えます。
オブザーバー:オブザーバーの役割は一般にインターフェイスであり、更新方法は1つしかありません。オブザーバーの状態が変更されると、この方法は呼び出されます。
特定のオブザーバー:この役割は簡単に拡大するために使用され、特定のビジネスロジックをこの役割で定義できます。
特定のオブザーバー:オブザーバーインターフェイスの特定の実装。この役割では、観測されているオブジェクトの状態が変化するときに処理されるロジック。
オブザーバーモードの実装の例
件名インターフェイス
パブリックインターフェイス件名{public void RegisterObserver(Observer O); public void removeObserver(オブザーバーo); public void NotifyAllobServers();}オブザーバーインターフェイス
パブリックインターフェイスオブザーバー{public void update(subject s);}ハンタークラスは、サブジェクトインターフェイスを実装します
java.util.arraylistをインポートします。パブリッククラスのヘッドハンターは件名を実装します{// Mike、Billなどのユーザーのリストを定義します。 private arrayList <String> Jobs; public headhunter(){userlist = new ArrayList <Observer>(); jobs = new ArrayList <String>(); } @Override public void RegisterObserver(Observer o){userlist.add(o); } @Override public void removeObserver(observer o){} @Override public void notifyAllobservers(){for(observer o:userlist){o.update(this); }} public void addjob(string job){this.jobs.add(job); notifyAllobServers(); } public ArrayList <String> getJobs(){return jobs; } public string toString(){return jobs.toString(); }}Jobseekerはオブザーバーです:
パブリッククラスのJobSeekerはオブザーバーを実装しています{プライベート文字列名; public jobseeker(string name){this.name = name; } @Override public void update(subject s){system.out.println(this.name + "got notified!"); //ジョブリストSystem.out.println(s)を印刷します。 }}始めましょう:
public class main {public static void main(string [] args){headhunter hh = new headhunter(); HH.RegisterObServer(New JobSeeker( "Mike")); HH.RegisterObServer(新しいJobSeeker( "Chris")); HH.RegisterObServer(新しいJobSeeker( "Jeff")); //ジョブを追加するたびに、すべてのジョブに通知できます。 HH.Addjob( "Google Job"); Hh.addjob( "yahoo job"); }}オブザーバーモードの利点
オブザーバーとオブザーバーはわずかに関連しており、抽象的に結合されているため、両方を拡張する方が簡単です。
オブザーバーモードは、一般的に使用されるトリガーメカニズムであり、トリガーチェーンを形成し、各オブザーバーのメソッドを順番に処理します。しかし同時に、これはオブザーバーモードの欠点でもあります。チェーンでトリガーされているため、多くのオブザーバーがいる場合、パフォーマンスの問題はより心配です。さらに、チェーン構造では、円形の参照エラーが発生する可能性が高く、システムが偽造されます。
要約します
Java言語には、インターフェイスオブザーバーとその実装クラスが観察可能であり、しばしばオブザーバーの役割を実装します。 JDK APIドキュメントで、これら2つのクラスの使用方法を表示できます。
VC ++、JavaScript DOM、またはAWT開発を行った友人はすべて、イベント処理について驚くべきものです。オブザーバーのパターンを理解した後、彼らはイベント処理メカニズムの原則を特定の理解を持っています。処理メカニズムをトリガーするイベントの関数を設計したい場合、オブザーバーモードを使用することが良い選択です。 AWTのイベント処理DEM(委任イベントモデル)は、オブザーバーモードを使用して実装されます。