JAVA设计模式(19):行为型-观察者模式(Observer)

观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过

呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

角色

抽象被观察者角色:把所有对观察者对象的引用保存在一个集合中,每个被观察者角色都可以有任意数量的观察

者。被观察者提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

具体被观察者角色:在被观察者内部状态改变时,给所有登记过的观察者发出通知。具体被观察者角色通常用一个

子类实现。

具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用

一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

开发中常见的场景

  • 聊天室程序的,服务器转给所有客户端
  • 网络游戏(多人联机对战)场景中,服务器将客户端的状态进行分发
  • 邮件订阅
  • Servlet中,监听器的实现
  • Android中,广播机制
  • JDK的AWT中事件处理模型,基于观察者模式的委派事件模型
  • 京东商城中,群发某商品打折信息
public interface Observer {
	public void update(Observable o, Object arg);
}

public class PriceObserver implements Observer {

	// 实现观察者必须实现的update方法
	public void update(Observable o, Object arg) {
		if (arg instanceof Double) {
			System.out.println("名称观察者: " + o + "物品价格已经改变为: " + arg);
		}
	}

}

public class NameObserver implements Observer {

	// 实现观察者必须实现的update方法
	public void update(Observable o, Object arg) {
		if (arg instanceof String) {
			// 产品名称改变值在name中
			String name = (String) arg;

			// 启动一个JFrame窗口来显示被观察者对象的状态改变
			JFrame f = new JFrame("观察者");

			JLabel l = new JLabel("名称改变为:" + name);

			f.add(l);
			f.pack();
			f.setVisible(true);
			System.out.println("名称观察者: " + o + "物品名称已经改变为: " + name);
		}
	}

}

public abstract class Observable {
	// 用一个List来保存该对象上所有绑定的事件监听器
	List<Observer> Observers = new ArrayList<Observer>();

	// 定义一个方法,用于该主题上注册观察者
	public void registerObserver(Observer o) {
		Observers.add(o);
	}

	// 定义一个方法,用于该主题上删除观察者
	public void removeObserver(Observer o) {
		Observers.remove(o);
	}

	// 通知该主题上注册的所有观察者
	public void notifyObservers(Object value) {
		// 遍历注册到该被观察者上的所有观察者
		for (Iterator<Observer> it = Observers.iterator(); it.hasNext();) {
			Observer o = (Observer) it.next();

			// 显示每个观察者的update方法

			o.update(this, value);
		}
	}
}

public class Product extends Observable {
	private String name;
	private double price;

	public Product(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}

	public Product() {
		super();
	}

	public String getName() {
		return name;
	}

	// 当程序调用name的setter方法来修改Product的name属性时
	// 程序自然触发该对象注册的所有观察者
	public void setName(String name) {
		this.name = name;
		notifyObservers(name);
	}

	public double getPrice() {
		return price;
	}

	// 当程序调用price的setter方法来修改Product的price属性时
	// 程序自然触发该对象注册的所有观察者
	public void setPrice(double price) {
		this.price = price;
		notifyObservers(price);
	}

}

public class Client {

	public static void main(String[] args) {
		// 创建一个被观察者对象
		Product p = new Product();

		// 创建两个观察者对象
		Observer no = new NameObserver();
		Observer po = new PriceObserver();

		// 向被观察者对象上注册上两个观察者对象
		p.registerObserver(no);
		p.registerObserver(po);

		// 程序调用setter方法来改变Product的name和price属性
		p.setName("笔记本");
		p.setPrice(321);

	}

}

时间: 2024-11-05 12:41:38

JAVA设计模式(19):行为型-观察者模式(Observer)的相关文章

java设计模式-创建型

1.设计模式介绍 1.1 设计模式的概念 1.设计模式是一套被反复使用,多数人知晓,经过分类编码目的的优秀代码设计经验的总结. 2.设计模式贯彻的原理:面向接口编程,而不是面向对象实现. 3.设计模式的目标:降低耦合性,增强灵活性. 1.2 设计模式的要素 1.模式名称 2.问题 3.环境与初始环境 4.解决方案 5.效果 6.举例 7.末态环境 8.推理 9.其他有关模式 10.已知的应用 1.3设计模式的分类 1.创建型 1.1  单例模式 1.2  工厂模式 1.3  抽象工厂模式 1.4

Java设计模式(八)观察者模式 迭代器模式

(十五)观察者模式 观察者模式,定义对象间一对多关系,一个对象状态发生改变,所有依赖于它的对象都收到通知并且自动更新,观察者与被观察者分开.例如邮件订阅.RSS订阅,如果有更新就会邮件通知你. interface Observers{ public void update(); } class Observer1 implements Observers{ public void update(){ System.out.println("observer1 has received"

&quot;围观&quot;设计模式(19)--行为型之观察者模式(Observer Pattern)

观察者模式是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实时事件处理系统.----WIKIPEDIA 个人理解 观察者模式,就是使得被观察者中持有观察者的对象实例,在发生某些事件的时候,通过notify"通知"观察者,完成相应的操作,他也叫作发布-订阅模式,定义对象间一对多的依赖关系,使得被观察者对象产生动作,即可通知其依赖的对象该被观察者发生了变更. 案例

[Android&amp;amp;Java]浅谈设计模式-代码篇:观察者模式Observer

观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个Demo来描写叙述一下这种思想,用java内置的Observer来实现这一思想. 好,程序猿是不善言语的,看代码先. 1.demo的结构: 2.先创建我们的主题类Subject,他就是我们本demo的明星类.继承了Observable,顾名思义,就是被观察的类 .其它观察者对他但是虎视眈眈哦(事实上

Java设计模式菜鸟系列(二)观察者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动跟新.Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口.先看uml模型图: 一.UML模型图 二.代码实现 /** 示例:咱们去菜市场买菜 * * 小商

【设计模式】Java设计模式第一课之观察者模式

我们可以用一个生活中的情景来认识一下观察者模式. 在这个时代,可能只有我们家里的老年人还保留着每天看报纸的习惯.报社负责生产内容,把它们组织到一张报纸上,每天进行印刷,然后送到每一个花钱订阅了报纸的用户家里.这样老人家就可以浏览一下每天发生的事情了. 这就是观察者模式最贴切的比喻.订阅者和报社是一对多的关系,每天只要更新了内容,就会统一把报纸送到用户的手里,当然,如果你不想订阅了,也可以退订.报社不知道你的状态,也不会关心你到底有没有看报纸,它的职责就是每天准时的把报纸送到你的家里. 下面是我看

Java设计模式学习笔记(观察者模式)

观察者模式说起来很简单,就是一个订报纸的模式.但是实际上这部分我觉得还是很有意思的,<Head First设计模式>里还有一些还没看完,也是因为理解的不够深吧. 观察者模式会包含两个组件:观察者和主题. 这段代码是主题的接口: package obeserver; public interface Subject { public void registerObserver(Observer observer); public void removeObserver(Observer obse

设计模式之二:观察者模式(Observer Pattern)

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

[设计模式]&lt;9&gt;. C++与观察者模式(observer pattern)

作者:默默地EEer 原文:http://www.cnblogs.com/hebaichuanyeah/p/6091694.html 意图: 定义对象间一对多的依赖关系,使得一个对象被改变,其他对象被更新. java的事件机制就是一个观察者模式,当事件发生,所有的事件接收者执行事件响应函数. 实现观察者模式,首先需要定义一个"观察者类(observer)"接口,在该类里面定义一个纯虚的事件响应函数. 并且需要一个"目标类(subject)",该类里面包含一个Set/

java设计模式案例详解:观察者模式

观察者模式的应用场景: 1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变. 2. 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节. 举个例子说明,这个例子讲述一个老大吩咐小弟做事的故事,只要老大一声令下小弟就开始工作,小弟成员可增减.根据模式定义,使用两个接口,多个实现 package main.java.com.learn.observer; /** * 干活接口,接到消息的类实现该接口干活,也就是观察者 * @author garfield * *