ホームページ Java &#&チュートリアル Observer パターン インスタンスの Java 実装の詳細 (図)

Observer パターン インスタンスの Java 実装の詳細 (図)

Mar 11, 2017 am 11:10 AM

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

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

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

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

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

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

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

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

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

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

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

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

See all articles