博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式
阅读量:7277 次
发布时间:2019-06-29

本文共 2230 字,大约阅读时间需要 7 分钟。

认识观察者模式

我们看看报纸和杂志的订阅是怎么回事:

1.报社的业务是出版报纸。

2.向某家报订阅报纸,只要他有新报纸出版,就会给你送来。只要你是他们的用户,你就会一直收到新报纸。

3.当你不想看报纸的时候,取消订阅,他们就不会再送新报纸来。

4.只要报社还在运营,就会一直人(或单位)向他们订阅报纸或取消订阅报纸。

出版者+订阅者=观察者模式

如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版者改称为“主题”(Subject),订阅者改称为“观察者”(Observer)。

让我们来看得更仔细一点:

定义观察者模式

当你试图勾勒观察者模式时,可以利用报纸订阅服务,以及出版者和订阅者比拟这一切。

在真实的世界中,你通常会看到观察者模式被定义成:

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

难察者模式定义了一系列对象之间的一对多关系。 当一个对象改变状态,其他依赖者都会收到通知。

主题和观察者定义了一对多的关系。观察者依赖子此主题,只要主题状态一有变化,观察者就会被通知。根据通知的风格,观察者可能因此新值而更新。

稍后你会右到,实现观察者模式的方法不只一种,但是以包含Subject与Observer接口的类设计的做法最常见。

实例:

气象监测应用的概况

此系统中的三个部分是气象站(获取实际气象数据的物理装置),WeatherDate对象(追踪来自气象站的数据,并更新布告栏)和布告栏

WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。WeatherData对象会随即更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。

如果我们选择接受这个项目,我们的工作就是建立一个应用,利用WeatherData对象取得数据,并更新三个布告板:目前状况.气象统计和天气预报。

布告栏(观察者),WeatherData对象(主题)

Observer.java

public interface Observer {	public void update(float temp, float humidity,float pressure);	}复制代码

subject.java

public interface subject {	public void registerObserver(Observer o);	public void removeObserver(Observer o);	public void notifyObserver();}复制代码

DisplayElement.java

public interface DisplayElement {	public void display();}复制代码

CurrentConditionDisplay.java

public class CurrentConditionDisplay implements Observer,DisplayElement{	private float temp;	private float humidity;	private float pressure;	private subject WeatherData;		CurrentConditionDisplay(WeatherData a){		this.WeatherData=a;		a.registerObserver(this);	}	@Override	public void display() {		// TODO Auto-generated method stub		System.out.println("temp="+temp+"\nhumidity="+humidity+"\npressure="+pressure);	}	@Override	public void update(float temp, float humidity, float pressure) {		// TODO Auto-generated method stub		this.pressure=pressure;		this.humidity=humidity;		this.temp=temp;		display();	}}复制代码

Observer.java

public interface Observer {	public void update(float temp, float humidity,float pressure);}复制代码

Test.java

public class Test {	public static void main(String[] args) {		// TODO Auto-generated method stub		WeatherData w=new WeatherData();		CurrentConditionDisplay a=new CurrentConditionDisplay(w);		w.setMeasurements(80, 30, 4);		w.setMeasurements(8, 3, 4);	} }复制代码

最后

后续还会更新其它设计模式,有错欢迎提出,谢谢!

转载地址:http://anscm.baihongyu.com/

你可能感兴趣的文章
计蒜客 蓝桥杯模拟 瞬间移动 dp
查看>>
手动删除oracle数据库
查看>>
Oracle 启动失败报错“TNS-12555: TNS:permission denied”解决办法
查看>>
this指针/常函数、常对象
查看>>
数字图像处理之sobel边缘检测
查看>>
Jmeter获取redis数据
查看>>
django 创建数据库的基本操作
查看>>
英语面试自我介绍
查看>>
写个OAuth2.0的请求端来测试自己的OAuth2.0服务端(二)
查看>>
Linux输入设备详解
查看>>
电子书,电子图书馆网址大全
查看>>
List中的get(i)
查看>>
整数N分解,搭积木,离散数学中的母函数,ZOJ(1163)
查看>>
mysql删除数据库文件ibdata1后引发的故障
查看>>
ansible笔记(3):ansible模块的基本使用
查看>>
tengine2.2.3报错502的The proxy server received an invalid response from an upstream server问题处理...
查看>>
7.2 main函数
查看>>
如何掌控自己的时间和生活 ---阿兰·拉金
查看>>
Linux shell编程与实践(九)之shell与shell的组合
查看>>
Foundation HTML5 Canvas中的2处错误
查看>>