设计模式: 自己手动实现一个观察者设计模式

观察者模式: 定义了对象之间的一对多依赖,这样一来。当一个对象(被观察者)改变状态时,它的全部依赖者(观察者)都会收到通知并自己主动更新。

在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。

用这个模式, 你能够改变依赖主题状态的对象。却不必改变主题。这叫提前规划。

主题和观察者都使用接口:观察者利用主题的接口向主题注冊。而主题利用观察者的接口通知观察者。这样能够让两者之间运作正常,有同一时候具有松耦合的长处。

观察者模式利用“组合”将很多观察者组合进主题中。对象之间的这样的关系不是通过继承产生的,而是在执行时利用组合的方式而产生的。

以下来看观察者设计模式的一个完整Demo

package observer;
/**
 * 被观察者接口
 * @author Arvon
 *
 */
public interface Subject {
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
}
package observer;
/**
 * 观察者接口
 * @author Administrator
 *
 */
public interface Observer {
	public void update(float temp,float humidity, float pressure);
}
package observer;
/**
 * 布告板接口
 * @author Administrator
 *
 */
public interface DisplayElement {
	public void display();

}
package observer;

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

/**
 * 被观察者的实现类
 * 主题
 * @author Administrator
 *
 */
public class WeatherData implements Subject {
	private List<Observer> observersList;
	private float pressure;
	private float humidity;
	private float temp;

	public WeatherData() {
		super();
		observersList = new ArrayList<Observer>();
	}

	@Override
	public void registerObserver(Observer o) {
		observersList.add(o);
	}

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

	@Override
	public void notifyObservers() {
		for (Observer observer : observersList) {
			observer.update(temp, humidity, pressure);
		}
	}

	public void setMeasurements(float temp, float humidity, float pressure){
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		messurementsChanged();
	}
	/**
	 * 当新的天气数据送来时。通知观察者
	 */
	private void messurementsChanged() {
		// TODO Auto-generated method stub
		notifyObservers();
	}

}
package observer;
/**
 * 眼下天气状况 布告板
 * @author Administrator
 *
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement {
	private float pressure;
	private float humidity;
	private float temp;
	private WeatherData weatherData;

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

	@Override
	public void display() {
		System.out.println("Current conditions:" + temp + "F Degrees and "
				+ humidity + "% humidity");
	}

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

	}

}
package observer;
/**
 * 气候统计
 * @author Administrator
 *
 */
public class StatisticsDisplay implements DisplayElement, Observer {

	@Override
	public void update(float temp, float humidity, float pressure) {
		// TODO Auto-generated method stub

	}

	@Override
	public void display() {
		// TODO Auto-generated method stub

	}

}
package observer;
/**
 * 天气预报
 * @author Administrator
 *
 */
public class ForecastDisplay implements DisplayElement, Observer {

	@Override
	public void update(float temp, float humidity, float pressure) {
		// TODO Auto-generated method stub

	}

	@Override
	public void display() {
		// TODO Auto-generated method stub

	}

}

package observer;
/**
 * 測试类
 * @author Administrator
 *
 */
public class WeatherStation {

	public static void main(String[] args) {
		WeatherData weatherData = new WeatherData();
		CurrentConditionsDisplay cDisplay  = new CurrentConditionsDisplay(weatherData);
		weatherData.setMeasurements(80.0f, 65, 30.4f);
	}

}

程序的输出 :  Current conditions:80.0F Degrees and 65.0% humidity

时间: 2024-10-16 11:49:40

设计模式: 自己手动实现一个观察者设计模式的相关文章

监听器和 利 用观察者设计模式设计一个程序

一.监听器概念 1.事件源:发生事件的对象. 2.监听器:是一个接口,监听事件源上要发生的动作 3.事件:事件对象一般是作为监听器方法的参数存在的,它封装了发生事件的对象 二.Servlet中提供的监听器(8个) 八个监听器分类: 2.1监听ServletContext.HttpSession.ServletRequest对象的创建和销毁的监听器. ServletContextListener:监听ServletContext对象的创建和销毁. HttpSessionListener:监听Htt

Cocos中的观察者设计模式与通知机制

观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是 MVC( 模型-视图-控制器)模式的重要组成部分.天气一直是英国人喜欢讨论的话题,而最近几年天气的变化也成为中国人非常关注的话题.我会根据天气预报决定是坐地铁还是开车上班,我的女儿也会根据天气预报决定明天穿哪件衣服.于是我在移动公司为我的手机定制了天气预报短信通知服务,它的工作模型如图所示. 每天气象局将天气预报信息投送给移动运营商,移动运营商的短信中心负责把天气预报发送给定制过这项服务的手机.在软件系统

观察者设计模式

/** * 事件接口即被观察者 * * @author Host * */ publicinterface Event { void attach(Listener listener); void detach(Listener listener); void notifyListener(); } /** * 事件监听者观察者 * * @author Host * */ publicinterface Listener { void execute(); } 事件源的一个实现类(磁盘事件) p

(java)从零开始之--观察者设计模式Observer

观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理. 步骤: 1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对象的动作做出的相应处理方法定义在接口上(这是一种规范,凡事需要A对象通知的对象,都要实现该接口). 2. 在A对象维护接口的引用,当A对象发生指定的动作这时候即可调用接口中的方法. 观察者模式的应用场景: 1. 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变. 2.对象仅需要

观察者设计模式 Vs 事件委托(java)

观察者设计模式 Vs 事件委托 转载请注明原博客地址: http://blog.csdn.net/gdutxiaoxu/article/details/51824769 源码下载地址: http://download.csdn.net/detail/gdutxiaoxu/9567209 本篇博客主要讲解一下几个问题 什么是观察者模式 观察者模式的优缺点 如何看待观察者模式的缺点 事件的委托 什么是观察者模式 简单来说,当有多个观察者想同时观察同一个主题对象的时候,当主题对象的 状态发生变化,观察

Cocos观察者设计模式和通报机制

观察员(Observer)模式也称为公告/订阅(Publish/Subscribe)模式.这是 MVC( 模型-视图-控制器)模型的重要组成部分.天气一直讨论的英国最喜欢的话题,近期天气变化几年已成为非常关注的中国人的话题.会依据天气预报决定是坐地铁还是开车上班,我的女儿也会依据天气预报决定明天穿哪件衣服.于是我在移动公司为我的手机定制了天气预报短信通知服务,它的工作模型如图所看到的. 每天气象局将天气预报信息投送给移动运营商,移动运营商的短信中心负责把天气预报发送给定制过这项服务的手机.在软件

JS观察者设计模式:实现iframe之间快捷通信

观察者设计模式又称订阅发布模式,在JS中我们习惯叫做广播模式,当多个对象监听一个通道时,只要发布者向该通道发布命令,订阅者都可以收到该命令,然后执行响应的逻辑.今天我们要实现的就是通过观察者设计模式,实现iframe之间的通信. 一.top对象 一般的JS书里都会在讲框架集的时候讲top,这会让人误解,认为top对象只是代表框架集,其实top的含义应该是说浏览器直接包含的那一个页面对象,也就是说如果你有一个页面被其他页面以iframe的方式包含了,无论包含的层级是什么,都可以用top访问最外层的

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

观察者设计模式 观察者模式定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 观察者模式的结构 抽象主题角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者.抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色. 具体主题角色:将有关状态存入具体观察者对象:在具体主题的内部状态改变时,给所有登记过的观察者发出通知.具体主题角色

iOS常用设计模式——观察者设计模式

观察者设计模式详解 观察者设计模式详解 基本概念 NSNotificationCenter的使用 添加监听 接收消息 删除监视 KVO的使用 基本概念 注册观察者 观察者对象发生变化时的回调方法 remove观察者身份 代码实现 基本概念 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.而在IOS开发中我们可能会接触到的经典观察者模式的实现方式,有这么几种:NSNotificationCen