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

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

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

个人感觉假设要用到观察者模式一定要用到面向接口编程的设计原则,要定义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方法。

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

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

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

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

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  3. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  4. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  5. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  6. 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)

    观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...

  7. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  8. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

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

    在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件, ...

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

    观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ...

随机推荐

  1. Linux网络基础配置

    这是看itercast视频的笔记 Linux网络基础配置 以太网连接 在Linux中,以太网接口被命令为:eth0, eth1等, 0,1代表网卡编号 通过lspci命令可以查看网上硬件信息(如果是u ...

  2. Android 系统搜索框(有浏览记录)

    实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件  要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...

  3. iOS_时间相关

    计算两个时间之差,并以倒计时的方式显示: 比如:剩余XX天XX小时XX分XX秒 效果图例如以下: NSDate的分类: 使用场景: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  4. Delphi的指针 good

    Pointers are like jumps, leading wildly from one part of the data structure to another. Their introd ...

  5. Java魔法堂:JVM的运行模式 (转)

    一.前言 JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅. 二.介绍 在$JAVA_HOME/jre/ ...

  6. DLNA_百度百科

    DLNA_百度百科 DLNA

  7. SLB 权重问题

    <pre name="code" class="html">一般配置SLB的时候有个权重0到100,是如何选择数值的? 权重需要您根据后端机器的配置 ...

  8. Qt线程同步操作用QWaitCondition QMutex

    可以看到Qt提供了一个等待事件发生的类QWaitCondition,当条件满足时可以唤醒其它等待的线程. 写一个类可以在线程间实现同步功能 #ifndef THREADEVENT_H #define ...

  9. iOS中的字符串NSString

    创建一个字符串对象: NSstring * str1 = @"hello world"; NSString * str = [[NSString alloc]initWithStr ...

  10. ZOJ 3542 2011大连现场赛D题(简单模拟)

    Hexadecimal View Time Limit: 2 Seconds       Memory Limit: 65536 KB Hexadecimal is very important an ...