Observer パターン インスタンスの Java 実装の詳細 (図)
1. Java自带的实现
类图
/** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservable extends Observable { private int data; public UpdateObservable(Observer observer) { addObserver(observer); /* * add other 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 synchronized 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 UpdateObserver implements Observer { @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. 自定义的观察模型
类图
/** * 抽象观察者 Observer * 观察 更新 * @author stone * */ public interface IWatcher { /* * 通知接口: * 1. 简单通知 * 2. 观察者需要目标的变化的数据,那么可以将目标用作参数, 见Java的Observer和Observable */ // void update(IWatched watched); void update(); }
/** * 抽象目标 Subject * 提供注册和删除观察者对象的接口, 及通知观察者进行观察的接口 * 及目标 自身被观察的业务的接口 * @author stone * */ public interface IWatchedSubject { public void add(IWatcher watch); public void remove(IWatcher watch); public void notifyWhatchers(); public void update();//被观察业务变化的接口 }
/** * 具体观察者 Concrete Observer * * @author stone * */ public class UpdateWatcher implements IWatcher { @Override public void update() { System.out.println(this + "观察到:目标已经更新了"); } }
/** * 具体目标角色 Concrete Subject * @author stone * */ public class UpdateWatchedSubject implements 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 onRegistered(); }
/** * 监听 当用户登录后 * @author stone * */ public interface ILoginListener { void onLogined(); }
/* * 监听器 是观察者模式的一种实现 * 一些需要监听的业务接口上添加 监听器,调用监听器的相应方法,实现监听 */ public class User { public void register(IRegisterListener register) { /* * do ... register */ System.out.println("正在注册中..."); //注册后 register.onRegistered(); } public void login(ILoginListener login) { /* * do ... login */ System.out.println("正在登录中..."); //登录后 login.onLogined(); } }
/** * 观察者(Observer)模式 行为型模式 * 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时观察某一个目标对象。 * 这个目标对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己 * 目标对象中需要有添加、移除、通知 观察者的接口 * * @author stone */ public class Test { public static void main(String[] args) { /* * 使用Java自带的Observer接口和Observable类 */ UpdateObservable observable = new UpdateObservable(new UpdateObserver()); observable.setData(99); System.out.println(""); System.out.println(""); /* * 自定义的观察者模型 */ IWatchedSubject watched = new UpdateWatchedSubject(); watched.add(new UpdateWatcher()); watched.add(new UpdateWatcher()); watched.update(); System.out.println(""); /* * 子模式-监听器 */ 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("监听到登录后。。。"); } }); } }
打印
接收到数据变化的通知: 数据变更为:99 目标更新中.... observer.UpdateWatcher@457471e0观察到:目标已经更新了 observer.UpdateWatcher@5fe04cbf观察到:目标已经更新了 正在注册中... 监听到注册后。。。 正在登录中... 监听到登录后。。。
以上がObserver パターン インスタンスの Java 実装の詳細 (図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
