オブザーバー パターンはパブリッシュ/サブスクライブ パターンとも呼ばれ、オブジェクト間の1 対多の関係です。オブジェクトが変更されると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。
抽象テーマの役割 (件名
#)
メソッドと、オブザーバーに通知する抽象メソッドを提供します。これらは、抽象クラスまたは抽象クラスによって決定されます。インターフェイスの実装
抽象オブザーバー ロール (Observer)
更新された抽象メソッドが含まれます。抽象クラスまたはインターフェイスによって実装された、特定のサブジェクトから更新通知を受信したときに呼び出されます。
具体的なサブジェクトの役割 (具体的なサブジェクト)
特定のトピックが変更されると、それ自体をサブスクライブするすべてのオブザーバーに通知します
特定のオブザーバー ロール (具体的なオブザーバー)
トピックを受信した後に自身のステータスを変更します。変更通知
実装抽象オブザーバーオブザーバーインターフェース
public interface Observer { //收到通知,改变自身状态 void update(); }
特定のオブザーバーObserverOneおよびObserverTwo
public class ObserverOne implements Observer{ @Override public void update() { System.out.println("第一个观察者收到通知,状态更新了"); } }
public class ObserverTwo implements Observer { @Override public void update() { System.out.println("第二个观察者收到通知,状态更新了"); } }
SubjectInterface
#
public interface Subject { //添加观察者 void add(Observer observer); //删除观察者 void remove(Observer observer); //通知所有观察者 void notifyObservers(); //自身操作 void operation(); }
AbstractSubjectAbstract クラス。オブザーバーの数は固定されていないため、
を使用してオブザーバーを保存し、Subject インターフェイスに add、remove、notifyObservers メソッドを実装します。 .操作メソッドは特定のターゲット クラスによって実装されます
public abstract class AbstractSubject implements Subject{ Vectorvector = new Vector (); @Override public void add(Observer observer){ vector.add(observer); } @Override public void remove(Observer observer){ vector.remove(observer); } @Override public void notifyObservers(){ for (Observer observer : vector) { observer.update(); } } }
MySubjectAbstractSubject クラスを継承します、操作メソッドを実装し、操作メソッド内で
を呼び出して、自身の状態が変化した後にオブザーバーに通知する効果を実現します
public class MySubject extends AbstractSubject{ @Override public void operation() { System.out.println("具体目标状态改变"); System.out.println("正在通知观察者。。。"); notifyObservers(); System.out.println("通知完毕!"); } }
Test
public class Test { public static void main(String[] args) { MySubject mySubject = new MySubject(); mySubject.add(new ObserverOne()); mySubject.add(new ObserverTwo()); mySubject.operation(); } }
ログイン後にコピー
概要
オブザーバー パターンは主にどのような問題を解決しますかアンダー ロー結合条件、オブジェクトの状態が変化すると、他のオブジェクトが通知を受け取る
オブザーバー パターンを使用する場合オブジェクトの状態が変化すると、すべてが依存しますオブジェクトはブロードキャスト通知を受信します
#オブザーバー パターンの利点
オブザーバーとターゲットは抽象的に結合されており、低結合であり、一連のトリガー メカニズムを備えています
オブザーバパターンのデメリット
①対象に依存する直接オブザーバや間接オブザーバが多数ある場合、全員に通知するのに時間がかかるオブザーバー
- ②ターゲットに直接オブザーバーと間接オブザーバーが多数ある場合循環依存関係がある場合、循環呼び出しが発生してシステムがクラッシュする可能性があります
##③オブザーバーは、ターゲットの状態がどのように変化するかを知ることはできません。ターゲットの状態が変化したことだけを知ることができます。
- オブザーバー パターンに関する注意事項
①JAVA にはオブザーバー パターンのサポート クラスがすでに存在しており、直接使用できます
- #②循環呼び出しを避ける
##③オブザーバーの update メソッドを逐次実行すると、オブザーバーのエラーによりシステムが停止してしまうため、一般的には非同期方式が使用されます。
以上がJAVAでオブザーバーパターンを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2024-08-26 10:40:31
-
2024-08-26 10:40:30
-
2024-08-26 10:40:10
-
2024-08-26 10:40:09
-
2024-08-26 10:40:01
-
2024-08-26 10:39:34
-
2024-08-26 10:39:10
-
2024-08-26 10:39:09
-
2024-08-26 10:39:02
-
2024-08-26 10:39:01
最新の問題
ページを離れることなく PHP を実行する
フォーム - テキストエリア(suという名前)と送信ボタンがあります。フォームが送信された後、ページを更新したり「エコー」のままにしたり、何らかの形で画面にリターンを印刷したりせず...
から 2023-10-23 19:05:06
0
1
285
Java プログラムでの SQL インジェクション攻撃の防止
データベーステーブルを更新するには、Java プログラムにステートメントを追加する必要があります: Stringinsert="INSERTINTOcustomer(na...
から 2023-10-20 20:06:17
0
2
256
JavaScriptを使用してDIVの内部テキストを取得するにはどうすればよいですか?
Javaスクリプトを使用してDIVコントローラの内部テキストを取得するにはどうすればよいですか?
から 2023-10-18 11:02:20
0
3
258
テーマが変わったときにイベントを作成する方法
テーマを変えてイベントを開催したい。 setTheme() は使用しないでください。 vareditor=ace.edit("editor");ace.requ...
から 2023-09-10 19:52:39
0
1
306