设计模式二之观察者模式(Subject-Observer)
观察者模式定义了一系列对象之间的一对多关系,当一个主题对象改变状态,其他所有的依赖者都会收到通知。
好了,你可能会觉得上面的描述略微复杂,较难理解,那么现在我们将用一个简单的例子去讲解这个模式。
我们先来分析出版和订阅的关系:

出版和订阅的关系:
(1) 一家出版公司,负责每天按时出版报纸
(2) 很多个用户订阅报纸,每天会收到出版社出版的报纸内容,用户可以订阅(注册),也可以取消订阅(注销注册信息)。
(3) 出版社和用户之间的关系是一(出版社)对多(用户)的关系,并且用户依赖出版社出版的报纸,以实现对自身信息数据的刷新。
(4) 我们将出版社看成主题,将用户看成观察者,整个过程就是一个 主题---观察者模式,也就是 Subject--Observer模式。
这就是最简单的观察者模式,简单理解了之后,我们来做一个气象站,需求如下:
(1) 我们需要实现一个气象站
(2) 有一个 WearherData 对象负责追踪 温度,湿度和气压的变化
(3) 有很多种不同类型(WeatherObject)的布告板,用来显示当前的天气状况,布告板必须实时更新
分析以上三个条件,可以知道 WeatherData 和 WeatherObject 存在一对多的关系,并且多个 WeatherObject 依赖 WeatherData 进行数据的刷新。

将整个过程采用观察者模式来进行分析:

接下来,我们用代码实现上面的图:
(1) 3个接口,一个Subject (主题接口), 一个 Observer(观察者接口),一个DisplayElement(布告板接口)
Subject(主题)接口:

Observer(观察者接口):

DisplayElement(布告板)接口:

(2) 实现主题(Subject)接口的WeatherData类:
public class WeatherData implements Subject{
private float tempture;
private float pressure;
private float humity;
List<Observer> observers;
public WeatherData() {
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer obv) {
// TODO Auto-generated method stub
//注册方法中将需要注册的观察者加到List中
observers.add(obv);
}
@Override
public void removeObserver(Observer obv) {
// TODO Auto-generated method stub
//注销方法中将需要注销的观察者移除
int i = observers.indexOf(obv);
if(i>=0)
{
observers.remove(i);
}
}
@Override
public void NotifyAllObserver() {
// TODO Auto-generated method stub
//通知所有观察者进行数据的刷新
for(int i=0 ;i<observers.size(); i++)
{
//获取到每一个观察者的对象,把该对象的所有属性值改变就行
Observer observer = (Observer)observers.get(i);
observer.update(tempture, humity, pressure);
}
}
public void SetMesurements(float tempture, float humity, float pressure)
{
this.humity = humity;
this.pressure = pressure;
this.tempture = tempture;
MeasurementChanged();
}
private void MeasurementChanged() {
// TODO Auto-generated method stub
NotifyAllObserver();
}
}
(3) 现在就可以任意画自己想要的布告板了:
public class CurrentConditionDisplay implements Observer, DisplayElement {
private float tempture;
private float humidity;
private float pressure;
private Subject WeatherData;
@Override
public void display() {
// TODO Auto-generated method stub
//展示布告板
System.out.println(tempture+""+humidity+""+pressure);
}
@Override
public void update(float temp, float humidity, float pressure) {
// TODO Auto-generated method stub
this.humidity = humidity;
this.tempture = temp;
this.pressure = pressure;
display();
}
public CurrentConditionDisplay(Subject weatherData)
{
//在构造方法中注册观察者
this.WeatherData = weatherData;
WeatherData.registerObserver(this);
}
}
(4) 最后,写一个测试类,测试我们画好的布告板:
public class projectTestClass {
public static void main(String[] args)
{
WeatherData weathData = new WeatherData();
CurrentConditionDisplay ss = new CurrentConditionDisplay(weathData);
weathData.SetMesurements(10, 10, 10);
}
}
这就是整个观察者模式的处理过程。
设计模式二之观察者模式(Subject-Observer)的更多相关文章
- C#设计模式之十七观察者模式(Observer Pattern)【行为型】
一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲& ...
- C#设计模式系列:观察者模式(Observer)
在软件构建过程中,需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象都需要得到通知. 1.观察者模式简介 1.1>.定义 定义对象间的一种一对多的依赖关系,当一个对 ...
- c#设计模式系列:观察者模式(Observer Pattern)
引言 在现实生活中,处处可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友,这些都属于观察者模式的应用.在这一章将分享我对观察者模式的理解,废话不多说了,直接进入今天的主题. 观察者模 ...
- 设计模式学习之观察者模式(Observer,行为型模式)(7)
1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3 ...
- 设计模式 之 《观察者模式 (Observer)》
#ifndef __OBSERVER_MODEL__ #define __OBSERVER_MODEL__ #include <string> #include <iostream& ...
- 设计模式 (二)——观察者模式(Observer,行为型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.观察者模式(Observer Pattern)属于行为型模式,在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都 ...
- C#设计模式之十六观察者模式(Observer Pattern)【行为型】
一.引言 今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份)把所有的模式写完,2018年,新的一年写一些新的东西.今天我们开始讲“行为 ...
- C#设计模式(17)——观察者模式(Observer Pattern)
一.引言 在现实生活中,处处可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友,这些都属于观察者模式的应用.在这一章将分享我对观察者模式的理解,废话不多说了,直接进入今天的主题. 二. ...
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
随机推荐
- js原生实现抽奖活动(方形非圆盘)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- http压测工具wrk使用
安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源 ...
- pytest-xdist分布式执行测试用例
前言 平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟.如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,我们会用测试人力成本换取时间成本,这个时候多找个 ...
- @keyframs实现图片gif效果
页面中使用动效图 一般让设计出一个gif格式的图,但是git图效果都很差,有一个替代gif图做动效的方法:使用@keyframes 具体思路: 1.设计两个互斥的图片(相当于把gif图分割成一帧一帧的 ...
- cron表达式总结
cron表达式用于配置cronTrigger的实例,在定时任务中会用到cron表达式.cron表达式实际上是由七个子表达式组成.这些表达式之间用空格分隔. 可通过工具校验:http://cron.qq ...
- Java NIO 系列学习(一)Java NIO概述
参考资料: http://www.importnew.com/19816.html http://ifeve.com/overview/ NIO 三大核心部分: Channel(通道).Buffer( ...
- tcp和udp区别
1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 2.TCP提供可靠的服务.也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP ...
- pytest--fixture参数化的实现方式和执行顺序
之前看到fixture函数可以通过添加,params参数来实现参数化,后续看到了悠悠 的博客,可以通过@pytest.mark.parametrize来实现,现在做一个总结 实现方式一 通过param ...
- Vnpy官网汇总
Vnpy首页:http://www.vnpy.cn/ Vnpy社区:https://www.vnpy.com/ Vnpy论坛:http://www.vnpie.com/forum.php Github ...
- (3)arp协议
arp协议:通过ip找mac(交换机不能识别ip) arp解析表: mac 和 ip 的映射关系 arp协议: 通过ip找到mac,可以减少广播的频率,减少主机的损耗. arp协议: 能够完成,依靠交 ...