`
liliang1222
  • 浏览: 157364 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

the observer pattern 观察者模式

阅读更多

 keeping your objects in the know

 

类似于报纸发行商和订阅者之间的关系
publisher + subscribers = observer pattern
我们称发行者为subject,订阅者为observers

 

1.subject对象管理一些数据
2.当subject对象中的数据改变时,通知observers
3.注册到subject的observers接收更新,当subject中的数据改变

 

观察者模式定义一个一对多的关系,当那个一个对象状态改变,附属的多个对象会接收到通知然后自动修改自己的状态

观察者模式提供subject和observer之间的松耦合
好处:
1.subject只知道observer实现了一个特定接口
2.很容易添加一个新的observer
3.添加新的observer不需要修改subject
4.重用subject,observer很方便,他们之间独立存在
5.对于subject,observer的修改不会影响到对方

 

例子:

一个天气采集系统,参数有温度,湿度以及气压,有多个显示系统,当3个参数改变的时候,显示系统都要相应的修改

一般情况的设计:

public calss WeatherData{
	//instance variable decalrations
	public void measurementsChanged(){
		float temp = getTemperature();
		float pressure = gethumidity();
		float pressure = getPressure();

		currentConditionsDisplay.update(temp,humidity,pressure);
		statisticsDisplay.update(temp,humidity,pressure);
	}
	//other weatherData methods here
}

 但是我们每次新添加一个显示系统需要修改代码,不能在运行时添加或者删除某个显示系统,采用观察者模式修改如下:

public interface Subject{
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObserver();
}

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

}

public class WeatherData implements Subject
{
	private ArrayList observers;
	private float temperature;
	private float humidity;
	private float pressure;

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

	public void registerobserver(Observer o){
		observers.add(o);
	}

	public void removeObserver(Observer o){
		int i = observers.indexOf(o);
		if(i>=0)
			observers.remove(o);
	}

	public void notifyObservers(){
		for(int i=0;i<observers.size();i++){
			Observer observer = (Observer)observers.get(i);
			observer.update(temperature,humidity,pressure);
		}
	}

	public void measurementsChanged(){
		notifyObservers();
	}

	public void setMeasurements(float t,float h,float p){
		this.temperature = t;
		this.humidity = h;
		this.pressure = pressure;
		measurementsChanged();
	}
	//other get-method
}


public class CurrentConditionsDisplay implements Observer
{
	private float temperature;
	private float humidity;
	private float pressure;
	private Subject weatherData;

	public CurrentConditionsDisplay(Subject weatherData){
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}

	public void update(float f,float h,float p){
		this.temperature = t;
		this.humidity = h;
		this.pressure = pressure;
		display();
	}

	public void display(){
		//do something
	}

}

public class WeatherStation
{
	public static void main(String[] args){
		WeatherStation weatherStation = new WeatherStation();

		CurrentConditionsDisplay currentDisplay
			= new CurrentConditionsDisplay(weatherStation);

		weartherStation.setMeasurements(80,65,30.4f);
	}
}

 这样我们给subject新建一个observer的时候就不用修改subject的代码,实现松耦合

 

 

java内置的观察者模式
Observer interface
Observable class

 

1.新建一个observer
实现java.util.Observer接口,可以调用addObserver()和deleteoberser()

 

2.observable发送通知
 1>先调用setChanged()方法指明状态已经修改
 2>调用notifyObservers()方法:notifyObservers()或者notifyObservers(Object arg)
我们可以在setChanged()方法中加入一些特殊条件的判断

 

3.observer接收通知
 update(Observable o,Object arg)
 这里的object对应notifyObservers(Object obj)中的对象, 如果调用的notifyObservers()方法,则update中的Object为null

 observer可以用传递过来的参数也可以从Observable中通过getter方法得到 需要的参数

package pattern;

import java.util.Observable;

public class WeatherData extends Observable{

	private float temperature;
	private float humidity;
	private float pressure;
	
	public WeatherData(){
		
	}
	
	public void measurementsChanged(){
		setChanged();
		notifyObservers();
	}
	
	public void setMeasurements(float temperature,
			float humidity,
			float pressure){
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}

	public float getTemperature() {
		return temperature;
	}

	public float getHumidity() {
		return humidity;
	}

	public float getPressure() {
		return pressure;
	}
	
	
}

 

package pattern;

import java.util.Observable;
import java.util.Observer;

public class CurrentConditionsDisplay implements Observer {

	Observable observable;
	private float temperature;
	private float humidity;

	public CurrentConditionsDisplay(Observable observable) {
		this.observable = observable;
		observable.addObserver(this);
	}

	public void update(Observable obs, Object arg) {
		if (obs instanceof WeatherData) {
			WeatherData weatherData = (WeatherData) obs;
			this.temperature = weatherData.getTemperature();
			this.humidity = weatherData.getHumidity();
			display();
		}

	}

	public void display() {
		System.out.println("current condition: " + temperature + "F degrees and " + humidity + "% humidity");
	}

}

  

分享到:
评论

相关推荐

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

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

    定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

    ObserverPattern

    设计模式之观察者模式ObserverPattern

    swift-Swiftµframework实现观察者模式Observerpattern

    Swift µframework 实现观察者模式Observer pattern

    observer-pattern-demo 观察者模式示例

    observer-pattern-demo 观察者模式示例

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

    观察者模式(Observer)原理图

    观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...

    matlab开发-Observerpattern

    matlab开发-Observerpattern。观察者模式示例

    java观察者模式.doc

    在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer)...

    ObserverPattern.unitypackage

    ObserverPattern.unitypackage是一个以unity为例写的观察者模式的应用举例。有需要的同学请下载!

    C#观察者模式(Observer Pattern)实例教程

    主要介绍了C#观察者模式(Observer Pattern),主要以一个实例的形式讲述了C#观察者模式的实现过程,详细讲述了接口的定义、通知及动作的实现方法,需要的朋友可以参考下

    JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解

    主要介绍了JavaScript编程设计模式之观察者模式(Observer Pattern),简单说明了观察者模式的概念、原理并结合实例形式详细给出了观察者模式的相关实现与使用技巧,需要的朋友可以参考下

    C#版 24种设计模式

    工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...

    观察者模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

    用Java实现23种设计模式

    观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    1、策略模式STRATEGY PATTERN ...16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    ObserverPattern2-Code5.zip

    这是关于C#中的观察者模式的教程文章。我们首先介绍作为GoF模式之一的经典观察者模式。观察者模式通过使用事件机制集成到C#中,这将在接下来讨论。然后,我们讨论与在C#中使用事件/事件处理程序相关的问题。

    观察者模式源码

    日常开发中常用的行为型设计模式之观察者模式设计源码demo

Global site tag (gtag.js) - Google Analytics