设计模式二之观察者模式(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.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
随机推荐
- Java内存模型探秘
1.Java内存模型概述 Java内存模型是一种抽象概念,不是真实存在的.主要定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存取出变量这样的底层细节.注意:这里的变量仅包括实例字段 ...
- C# 如何获取可执行文件路径的上上级目录
1. DirectoryInfo di = new DirectoryInfo(string.Format(@"{0}..\..\", Application.StartupPat ...
- linux配置虚拟机的网络服务
一.找到网卡位置 二.配置协议 删除网卡物理地址+UUID(方便后期克隆虚拟机,不至于多个虚拟机之间有相同的网卡物理地址,防止出现网络问题)`` cd /etc/sysconfig/network-s ...
- 创建X个任意元素数组并且可以遍历的的一个方法
方法一: Array.apply(null, { length: 20 })分析:apply 第二个参数应该是数组,现在把 { length: 20 } 转化为数组,就是一个长度为X的数组(类数组对象 ...
- JAVA-重载(overload)和重写(overrite)
1.重载发生在同一个类中.有多个方法名相同,但是参数列表不同(包括参数个数和参数类型),和返回值无关,权限修饰符也无关. 2.重写(即覆盖)发生在子类和父类中.子类和父类的方法名.参数列表相同:子类的 ...
- python两个列表合并为字典,一个作为key,一个作为value
两个列表合并为一个字典函数list_dic(list1,list2)可以直接复制拿走 传入的参数为两个列表,list1准备作为key,list2准备作为value,key和value位置一一对应. d ...
- oracle 12 c 创建表空间,用户名,及表
-----------------------------------------12C start------------------------------------------- -- 创 ...
- 登录获取token,token参数关联至所有请求的请求体内
问题描述: 有些系统接口判断用户是否登录,是校验登录接口成功后传的token值,也就是请求系统所有接口时,前端传参必带登录成功后接口返回的token,后台以此检验是否过期或是否有登录.所有接口都依赖登 ...
- html计时发送验证码功能的实现
function countdown() { var time=60; setTime=setInterval(function(){ if(time<=0){ clearInterval(se ...
- 2019南昌网络赛G. tsy's number
题意:\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\frac{\phi(i)*\phi(j^2)*\phi(k^3)}{\phi(i)*\phi(j)*\phi(k)} ...