观察者模式(Observer Patterns)

今天学习了观察者模式,做个总结,方便以后回想。

首先是定义:观察者模式就是定义对象之间一对多的依赖关系,当一个对象状态发生改变时,全部依赖他的对象都收到推送消息并自己主动更新做出改变。

我的理解:生活中就有非常多这种样例,比如气象观測站和气象显示仪的关系,气象显示站是数据中心,负责获得最新的气象消息,而气象显示仪则把即使的消息显示出来,全部的气象显示仪都依赖气象站,还有求职者和猎头公司的关系,猎头公司假设有新的信息,也会推送给求职者;这里气象站就是主题(中心),显示仪就是观察者。

个人感觉假设要用到观察者模式一定要用到面向接口编程的设计原则,要定义Subject接口来注冊,取消,推送;定义Observer接口来update,假设观察者还有其它功能,还要写其它的接口,比如display()的接口。

首先是Subject接口:提供了注冊,取消注冊,推送消息的方法。

package interfaces;

public interface Subject {

	public void registeObserver (Observer observer);
	public void removeObserver (Observer observer);
	//notify:通知,公告
	public void notifyObserver ();

}

然后是Observer接口,提供了更新操作,把获取到的数据更新到本地实例数据。

package interfaces;

public interface Observer {
	public void uodate (float temp, float humidity, float pressure);
}

然后是DisplayElement接口,提供了display方法。

package interfaces;

public interface DisplayElement {
	public void display();
}

然后是WeatherData,天气信息数据中心类,实现Subject接口,并提供了setMeasurements方法和measurmentChanged方法,观察者注冊的实现事实上就是把这个观察者加到中心的List里面,通知操作就是遍历List,都调用里面的update方法。

package subjects;

import java.util.ArrayList;
import java.util.List;

import interfaces.Observer;
import interfaces.Subject;

public class WeatherData implements Subject {
	private List list;
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherData() {
		list = new ArrayList();
	}

	@Override
	public void registeObserver(Observer observer) {
		list.add(observer);
	}

	@Override
	public void removeObserver(Observer observer) {
		int i = list.indexOf(observer);
		if(i>=0) {
			list.remove(i);
		}
	}

	@Override
	public void notifyObserver() {
		for(int i=0;i<list.size();i++) {
			Observer o = (Observer)list.get(i);
			o.uodate(temperature, humidity, pressure);
		}

	}

	public void measurementsChanged() {
		notifyObserver();
	}

	public void setMeasures(float temp, float humidity, float pressure) {
		this.temperature = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

}

然后定义了一个观察者CurrentConditionDisplay。新建的时候就要传递一个数据中心。

package observers;

import subjects.WeatherData;
import interfaces.DisplayElement;
import interfaces.Observer;
import interfaces.Subject;

public class CurrentConditionDisplay implements Observer, DisplayElement {
	private float tempurature;
	private float humidity;
	private float pressure;
	private Subject weatherData;

	public CurrentConditionDisplay(WeatherData weatherData) {
		this.weatherData = weatherData;
		weatherData.registeObserver(this);
	}

	@Override
	public void uodate(float tempurature, float humidity, float pressure) {
		this.tempurature = tempurature;
		this.humidity = humidity;
		this.pressure = pressure;
		display();

	}

	@Override
	public void display() {
		System.out.println(tempurature + ";/n" + humidity + ";/n"  +pressure );

	}

}

最后是一个測试类:

package test;

import observers.CurrentConditionDisplay;
import subjects.WeatherData;

public class Test {

	public static void main(String args[]) {
		WeatherData weatherData = new WeatherData();
		CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);

		weatherData.setMeasures(14.1f, 11.0f, 111.0f);
	}
}

事实上Java的Swing机制大量运用了这样的模式,比如button和监视器的关系,button是被观察者,监视器是观察者,addListener的时候事实上就是把监视器对象放到了自己的list内,点击的时候就调用list里面的监视器的performXX方法。

尽管仅仅是通过样例了解并练习了,可是能不能在以后实际项目中想到用到,是否熟练等,任重而道远。

时间: 2024-10-12 19:25:02

观察者模式(Observer Patterns)的相关文章

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

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

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型.该模式有两个角色,一个是Subject, 另一个是Observer.Subject 保存有多个Observer的引用,一旦特定的事件发生,Subject会通知它所有的Observer,Observer得到该通知后执行相关程序逻辑.其中,Observer只有先向Subject注册后才能被Subject知晓.这就像订报纸,只有我们向出版社提出订报的申请,出版社才会把我们列入订阅者名单,然后每当新报纸印好时,出版社会通知订阅

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

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

设计模式之观察者模式(Observer)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 - 观察者模式(Observer Pattern) 详细说明

观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的全部依赖者都会收到通知并自己主动更新. 用法: 1. 首先新建主题(subject)接口, 负责注冊(register)\删除(remo

说说设计模式~观察者模式(Observer)

观察者模式,也叫发布/订阅模式(publish/subscribe),监视器模式等.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.. 何时能用到它? 此种模式通常被用来实现事件处理系统,例如,当一个数据仓储操作中,它的添加功能可能会有一个功能,当添加被触发时,所以订阅了这个添加事件需求的代码 块,都会被触发执行,在这个过程中,数据仓储的添加操作就是被观察者,而所以的订阅者就是它的观察者,发被观察者在某种情况

jQuery中的观察者模式(Observer Pattern)

在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件,自然触发 比如,我们给页面的body元素绑定一个click事件,这样写. <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title&

Java 设计模式系列(十六)观察者模式(Observer)

Java 设计模式系列(十六)观察者模式(Observer) 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 一.观察者模式的结构 Subject:目标对象,通常具有如下功能:

设计模式:观察者模式--Observer

一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时观察着小偷,当小偷正在偷东西「就给干警发送出一条信号,实际上小偷不可能告诉干警我有偷东西」,干警收到信号,出击抓小偷.这就是一个观察者模式 2.装模作样写作业 小时候家里家活比较多,爸妈让我去干活的时候,我偶尔会说我要学习「其实不想去干活,当然只是偶尔,我还是常常干家务的」,然后爸妈就去地里了,我一