`
liliang1222
  • 浏览: 158707 次
  • 性别: 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(订阅模式)3.zip"中的代码可能进一步阐述了观察者模式,这里的“订阅”一词可能意味着用户可以订阅特定的主题,只有当这些主题的状态改变时,用户才会收到通知。这与传统的观察者模式类似,但更加...

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    **C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...

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

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

    ObserverPattern

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

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

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,我们可以利用Java的内置接口`java.util.Observer`和`java.util....

    observer观察者模式

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在软件工程中,这常用于实现事件驱动编程,使得系统能够及时响应变化。 在...

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

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

    设计模式学习之Observer(观察者模式)

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

    观察者模式,Observer

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

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    设计模式实现——观察者模式

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

    设计模式-观察者模式-作业-observer.zip

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

    观察者模式observer

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

    java 设计模式 观察者模式 简单实例 包括测试test类

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

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

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

    观察者模式源码

    观察者模式(Observer Pattern)是软件设计模式的一种,属于行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式主要通过...

    56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1

    观察者模式(Observer Design Pattern)是行为型设计模式的一种,主要解决的是“类或对象之间的交互”问题。它定义了一个一对多的依赖关系,当一个对象的状态改变时,所有依赖的对象都会自动收到通知。 观察者模式...

    观察者模式(Observer)原理图

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

Global site tag (gtag.js) - Google Analytics