设计模式二之观察者模式(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.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
随机推荐
- Valotile关键字详解
在了解valotile关键字之前.我们先来了解其他相关概念. 1.1 java内存模型: 不同的平台,内存模型是不一样的,我们可以把内存模型理解为在特定操作协议下,对特定的内存或高速缓存进行读写访问 ...
- Cannot resolve classpath entry: /Program Files/IBM/SQLLIB/java/db2java.zip
在mybatis的逆向工程中,使用java代码和xml配置文件生成时出现以下的错误 原来自己在复制官方配置文件的参考时将这一句也复制了进来 删掉后运行即可!成功的话控制台是没有输出的
- 2019.4.24(js)
1. 取得正数和负数的绝对值 Math.abs(7.25) Math.abs(-7.25) 2.利用JS刷新页面方法 https://www.cnblogs.com/Chen-XiaoJun/p/62 ...
- Python Django Web开发的5个优秀好习惯
https://blog.csdn.net/weixin_42134789/article/details/82381854
- prometheus相关文章
prometheus book https://yunlzheng.gitbook.io/prometheus-book/ 开发自己的分布式监控Prometheus Exporter时遇到的坑 htt ...
- java集合详解(附栈,队列)
1 集合 1.1 为什么会出现集合框架 [1] 之前的数组作为容器时,不能自动拓容 [2] 数值在进行添加和删除操作时,需要开发者自己实现添加和删除. 1.2 Collection接口 1.2.1 C ...
- 蓝鲸DevOps深度解析系列(2):蓝盾流水线初体验
关注嘉为科技,获取运维新知 前面一篇文章<蓝鲸DevOps深度解析系列(1):蓝盾平台总览>,我们总览了蓝鲸DevOps平台的背景.应用场景.特点和能力: 接下来我们继续解析蓝盾平台的 ...
- 【记录】【3】设置bing为chrome的默认搜索引擎
方法:设置→搜索→管理搜索引擎→其他搜索引擎→设置bing搜索的网址为 http://cn.bing.com/search?q=%s 注:search?q=%s 是必须的,否则无法将其设置为默认 ...
- 按照分层设计理念,完成《XXX需求征集系统》的概念结构设计
按照分层设计理念,完成<XXX需求征集系统>的概念结构设计. 1.概要架构-初步设计 有关<XXX需求征集系统>的鲁棒图如下: 2.概要架构之高层分割 切系统为系统: 高层功能 ...
- 微信小程序 页面跳转方式
// 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. // 注意:调用 navigateTo 跳转时,调用该方法的页面会被加入堆栈,但是 redirectT ...