オブザーバーモードはソフトウェア設計モードの1つであり、特にGUIプログラミングでも一般的に使用されています。インターネットに書かれたデザインパターンに関する多くの記事があり、多くの記事がよく書かれています。初期のホイールを繰り返す疑いがありますが、このホイールは他のホイールではなく、焦点が異なり、アイデアが異なり、異なる方法を伝える方法があります。
重要な要素
テーマ:
トピックは、オブザーバーによって観察されたオブジェクトです。トピックには、次の3つの特性が必要です。
オブザーバー:
被験者が変更されると、特定の処理の通知を受信することは、オブザーバーが持つ必要がある機能です。
このモードを使用する理由
牛乳配達ステーションがテーマであることを説明する例を以下に示します。ミルクサブスクリプションの顧客はモニターです。顧客が牛乳配達ステーションから牛乳を購読した後、彼は毎日牛乳を受け取ります。顧客が購読したくない場合、彼はキャンセルすることができ、将来牛乳を受け取らないでしょう。
ゆるいカップリング
オブザーバーは、トピックを変更せずにコードを追加または削除します。トピックを追加または削除する対応する方法を呼び出します。
被験者は、オブザーバーに通知する責任がありますが、オブザーバーが通知にどのように対処するかを知る必要はありません。たとえば、牛乳配達ステーションは牛乳の供給のみを担当しており、顧客がそれを飲むか、顔を洗うかは気にしません。
オブザーバーは、トピックに関連する詳細を観察せずに、トピック通知を待つ必要があります。同じ例としては、顧客は牛乳を届けるために牛乳配達ステーションを気にするだけで、牛乳を届けるための宅配便業者や輸送の種類ではありません。
Javaはオブザーバーモードを実装します
1。Java独自の実装
クラス図
/ ** *観測ターゲットはjava.util.observable * @author stone *から継承されます * */ public class updateobservservserves extends {private int data; public upduttobservable(Observer Observer){addobserver(Observer); / * *他のオブザーバーを追加 */} public int getData(){return data; } public void setData(int data){if(data!= this.data){this.data = data; setChanged(); //変更のタグ、notifyobservers(); //通知}} @Override public synchronized void addobserver(observer o){super.addobserver(o); } @Override public synchronized void deleteobserver(Observer o){super.deleteobserver(o); } @Override public void notifyobservers(){super.notifyobservers(); } @Override public void notifyobservers(object arg){super.notifyobservers(arg); } @Override public synchronized void deleteobservers(){super.deleteobservers(); } @Override Protected同期void setChanged(){super.setchanged(); } @Override Protected Synchronized void clearchanged(){super.clearchanged(); } @Override public synchronized boolean haschanged(){return super.haschanged(); } @Override public synchronized int countobservers(){return super.countobservers(); }} / ** *オブザーバーはjava.util.observerインターフェイス * @Author Stone * */ public class updoweObserverを実装します{@Override public void update(Observable o、object arg){System.out.println( "データ変更の通知の受信通知:"); if(o instanceof updateobservable){updateObservable uo =(updateObservable)o; System.out.print( "データ変更:" + uo.getData()); }}} 2。カスタム観測モデル
クラス図
/ ** * abstract Observer * Observation Update * @Author Stone * */ public Interface iWatcher {/ * *通知インターフェイス: *1。Simple通知 * 2。オブザーバーはターゲットの変更のデータをパラメーターとして使用できます。 void update(); } / ** *抽象ターゲットの件名 *オブザーバーオブジェクトを登録および削除するインターフェイスと、観測者に観察者に通知するインターフェイスを提供し、ターゲットが観察されるインターフェイス * @author stone * */ publicインターフェイスiwatchedsubject {public void add(iwatcher watch); public void remove(iwatcher watch); public void NotifyWhatchers(); public void update(); //観測されたビジネスの変更へのインターフェイス} / ** *特定のオブザーバーコンクリートオブザーバー * * @author stone * */ public class updatewatcherはiwatcher {@override public void update(){system.out.println(this + "が観察された:ターゲットが更新されました"); }} / ** *特定のターゲットロールコンクリート件名 * @Author Stone * */ public class updatewatchedsubject Implesions iWatchedSubject {private list <iwatcher> list; public updateWatchedSubject(){this.list = new ArrayList <iwatcher>(); } @Override public void add(iwatcher watch){this.list.add(watch); } @Override public void remove(iwatcher watch){this.list.remove(watch); } @Override public void notifyWhatchers(){for(iwatcher watcher:list){watcher.update(); }} @Override public void update(){system.out.println( "ターゲットアップデート......"); NotifyWhatchers(); }}リスナーは、オブザーバーの実装です。
クラス図
/ ** *登録後のリスナー * @author stone * */ public interface iregisterlistener {void onegistered(); } / ** *リスナーユーザーが * @author stone * */ public interface iloginlistener {void onlogined(); } /**リスナーはオブザーバーモードの実装です*リスナーをリスニングを必要とするいくつかのビジネスインターフェイスに追加するには、リスナーの対応するメソッドを呼び出してリスニングを実装します*/ public classユーザー{public voidレジスタ(iregisterlistenerレジスタ){/** do ... register*/ system.out.println( "Registing ..."); //登録後に登録済み(); } public void login(iloginlistener login){ / * * do ... login * / system.out.println( "Registing ..."); // login.onlogined(); }} /***オブザーバーモードの動作パターン*オブザーバーモードは、1対多くの依存関係を定義し、複数のオブザーバーオブジェクトがターゲットオブジェクトを同時に観察できるようにします。 *このターゲットオブジェクトがその状態で変更されると、すべてのオブザーバーオブジェクトに通知され、自動的に自分自身を更新できます。ターゲットオブジェクトは、オブザーバーを追加、削除、および通知するインターフェイスを必要とします * * @author stone */ public class test {public static void main(string [] args){/ * * java独自のオブザーバーインターフェイスと観察可能なクラス */ updateObservservable observable = new updateObservable(new updateObserver()); Observable.SetData(99); System.out.println( ""); System.out.println( ""); /** Custom Observer Model*/ iWatchedSubject Watched = new UpdateWatchedSubject(); watched.add(new updateWatcher()); watched.add(new updateWatcher()); watched.update(); System.out.println( ""); /** sub-mode-listener*/ user user = new user(); user.register(new IregisterListener(){@Override public void onregistered(){system.out.println( "登録を聞いた後...");}}); user.login(new iloginlistener(){@override public void onlogined(){system.out.println( "login ...");}}); }}印刷
データ変更の通知:データの変更:99ターゲットが更新されています... Observer.updateWatcher@457471E0が観察されました:ターゲットが更新されましたobserver.updatewatcher@5fe04cbfが観察されました:ターゲットが更新され、登録されています...登録を聞いた後。 。 。ログイン...ログインを聞いた後。 。 。