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

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

阅读更多
        最近学习了下设计模式,整理下笔记,以后复习,也跟大家多交流交流,呵呵。。。
        观察者模式定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
        改变的对象一般称之为主题,而所有依赖者称之为观察者,只要主题状态一有变化,观察者就会被通知。
        实现观察者模式的方法:一般以主题Subject和观察者Observer接口的类设计此模式
OK,不多说,上实例,以一个天气预报为例:一个WeatherData对象(角色:Subject,记录气象站数据,并更新布告板),N个布告板(角色:Observer,显示天气状况)
        当WeatherData对象状态改变的时候,布告板自动更新,正好符合观察者模式。
/**
 * 主题
 */
public interface Subject {
    /**
     * registerObserver和removeObserver方法,都需要一个观察者作为
     * 变量,改观察者是用来以注册和删除的
     * 
     */
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	
	/**
	 * 当主题状态改变时,这个方法会被调用,以通知所有观察者
	 */
	public void notifyObservers();
}


/**
 *  观察者
 */
public interface Observer {
    /**
     * 
     * @param temp 天气温度
     * @param humidity 天气湿度
     * @param pressure 天气压力
     */
	public void update(float temp, float humidity, float pressure);
}


public interface DisplayElement {
	/**
	 * 当布告板需要显示的时候,调用此方法
	 */
	public void display();
}


WeatherData实现此主题接口
/**
 *  天气对象
 */
public class WeatherData implements Subject {
    /**
     * 观察者
     */
	private ArrayList observers;
	
	/**
     * 天气温度
     */
	private float temperature;
	
	/**
     * 天气湿度
     */
	private float humidity;
	
	/**
     * 天气压力
     */
	private float pressure;
	
	public WeatherData() {
		observers = 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(i);
		}
	}
	
	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 temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}
	
	// other WeatherData methods here
	
	public float getTemperature() {
		return temperature;
	}
	
	public float getHumidity() {
		return humidity;
	}
	
	public float getPressure() {
		return pressure;
	}
}


/**
 *  当前天气状态布告板
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement {
    /**
     * 天气温度
     */
    private float temperature;
	
    /**
     * 天气湿度
     */
    private float humidity;
    
	private Subject weatherData;
	
	public CurrentConditionsDisplay(Subject weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}
	
	public void update(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		display();
	}
	
	public void display() {
		System.out.println("Current conditions: " + temperature 
			+ "F degrees and " + humidity + "% humidity");
	}
}


/**
 *  预测天气状态布告板
 */
public class ForecastDisplay implements Observer, DisplayElement {
    /**
     * 当前气压
     */
    private float currentPressure = 29.92f;  
	
    /**
     * 最新气压
     */
    private float lastPressure;
	private WeatherData weatherData;

	public ForecastDisplay(WeatherData weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}

	public void update(float temp, float humidity, float pressure) {
                lastPressure = currentPressure;
		currentPressure = pressure;

		display();
	}

	public void display() {
		System.out.print("Forecast: ");
		if (currentPressure > lastPressure) {
			System.out.println("Improving weather on the way!");
		} else if (currentPressure == lastPressure) {
			System.out.println("More of the same");
		} else if (currentPressure < lastPressure) {
			System.out.println("Watch out for cooler, rainy weather");
		}
	}
}


/**
 *  测试
 */
public class WeatherStation {

	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
	
		CurrentConditionsDisplay currentDisplay = 
			new CurrentConditionsDisplay(weatherData);
		ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);

		weatherData.setMeasurements(80, 65, 30.4f);
		weatherData.setMeasurements(82, 70, 29.2f);
		weatherData.setMeasurements(78, 90, 29.2f);
	}
}



        总结:其实观察者模式,就是让主题Subject更新观察者Observer数据,所以Observer需要有update方法,且必须将其引用交给主题Subject,这样两者就有个关联关系,Subject就可以更新Observer数据,即为通知了观察者,自动更新了数据,呵呵,以上内容纯属个人理解,如有雷同,纯属巧合。。。
分享到:
评论
2 楼 jijun87120681 2011-12-30  
fvweieye 写道
楼主辛苦了,好人一生平安。完全同意楼主的观点。

 
1 楼 fvweieye 2011-12-30  
楼主辛苦了,好人一生平安。完全同意楼主的观点。

相关推荐

    设计模式--观察者模式java例子

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

    JAVA-设计模式-行为型模式-观察者模式

    JAVA-设计模式-行为型模式-观察者模式

    Android设计模式--观察者模式DEMO

    Android设计模式--观察者模式DEMO 观察者模式是一个使用频率非常高的模式,他最常用的地方是GUI系统和订阅-发布系统。 该模式的最重要的作用就是解耦,使观察者和被观察者之间依赖尽可能小,甚至好无依赖。

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

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

    设计模式-观察者

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

    C++设计模式--观察者模式 demo

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它在C++中的应用广泛且实用。这种模式的核心思想是“主体”(Subject)与“观察者”(Observer)之间的松耦合关系,允许一个对象(即主体)的状态...

    C++设计模式--基于Qt4开源跨平台开发框架

    行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式(Visitor),关注对象之间的交互和责任分配。 在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为...

    跟我一起学 设计模式-观察者模式

    观察者模式,也称为发布-订阅模式或事件驱动模式,是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在C#、ASP.NET等.NET框架中,...

    设计模式-观察者模式(讲解及其实现代码)

    总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高了代码的灵活性和可扩展性。在实际项目中,正确使用观察者模式可以有效地管理组件间的...

    c++设计模式-行为型模式-观察者模式

    c++设计模式-行为型模式-观察者模式;qt工程;c++简单源码; 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式...

    Java 设计模式-观察者模式(Observer)

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

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

    观察者模式是一种行为设计模式,它允许你定义一个订阅机制,可以及时地在对象之间传播状态变化。在Java中,观察者模式常用于构建事件驱动系统,使得多个对象能够监听并响应某个对象的状态改变。 首先,我们要理解...

    设计模式--观察者 c++版本

    观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是主体(Subject)与观察者(Observer)之间的...

    Java设计模式-第22章-观察者模式.ppt

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

    C++设计模式-基于QT4开源跨平台开发框架 源码

    3. **观察者模式** - QT4的信号和槽机制是观察者模式的实现。当一个对象的某个状态改变时,它可以发出信号,其他对象可以通过连接这些信号并定义槽函数来响应这些变化,实现了事件驱动的编程模型。 4. **装饰器模式...

    设计模式系列博客--观察者模式

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

    设计模式-Java语言中的应用

    设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...

    设计模式-观察者模式

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

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(...观察者模式(Observer Pattern)、责任链模式(Chain of Responsibility Pattern)、访问者模式(Visitor Pattern)、状态模式(State ...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建可扩展和可维护的系统时。HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念...

Global site tag (gtag.js) - Google Analytics