简介:

观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通。

认识观察者模式,看一个报纸、杂志订阅是怎么回事:

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

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

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

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

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



1. 定义:

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

2. 设计原则:

为了交互对象之间的松耦合设计而努力

松耦合的好处:当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。

3. 代码实现:

3.1 首先我们先定义

观察者主题接口

package com.chengzhang.subject;

/**
* 主题接口
* @author Administrator
*/ public interface Subject { /**
* 注册观察者
* @param observer
*/
public void registerObserver(Observer observer); /**
* 移除观察者
* @param observer
*/
public void removeObserver(Observer observer); /**
* 通知观察者
*/
public void notifyObservers();

观察者接口

package com.chengzhang.subject;

/**
* 观察者接口
* @author Administrator
*/ public interface Observer { /**
* 更新数据
* @param temp
* @param humidity
* @param pressure
*/
public void update(float temp, float humidity, float pressure); }

3.2 然后我们实现以上接口

实现主题接口

package com.chengzhang.subject.impl;

import java.util.ArrayList;
import java.util.List; import com.chengzhang.subject.Observer;
import com.chengzhang.subject.Subject; public class WeatherData implements Subject { // 存放观察者对象
private List<Observer> observersList; private float temperature; private float humidity; private float pressure; public WeatherData(){
observersList = new ArrayList<Observer>();
} @Override
public void registerObserver(Observer observer) {
observersList.add(observer);
} @Override
public void removeObserver(Observer observer) {
int index = observersList.indexOf(observer);
if(index >= 0){
observersList.remove(index);
}
} @Override
public void notifyObservers() { for(int i=0; i<observersList.size(); i++){
Observer observer = observersList.get(i);
observer.update(temperature, humidity, pressure);
}
} /**
* 天气发生变化会自动调用该方法
*/
public void measurementsChanged(){
notifyObservers();
} /**
* 假设天气发生变化
* @param temperature
* @param humidity
* @param pressure
*/
public void setMeasurements(float temperature, float humidity, float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
} }

实现布告板接口

package com.chengzhang.subject.impl;

import com.chengzhang.subject.Observer;
import com.chengzhang.subject.Subject; public class CurrentConditionsDisplay implements Observer { private float temperature; private float humidity; private float pressure; private Subject weatherData; public CurrentConditionsDisplay(WeatherData weatherData){
this.weatherData = weatherData;
this.weatherData.registerObserver(this);
} @Override
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
} public void display(){
System.out.println("当前温度:" + this.temperature);
System.out.println("当期湿度:" + this.humidity);
System.out.println("当期气压:" + this.pressure);
} }

4. 观察者模式测试

package com.chengzhang.subject.impl;

public class WeatherStation {

	public static void main(String[] args) {

		// 创建主题对象
WeatherData weatherData = new WeatherData(); // 创建观察者对象并注册
CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData); // 天气发生变化
weatherData.setMeasurements(12.44f, 23.12f, 22); } }

4.1 输出结果

当前温度:12.44
当期湿度:23.12
当期气压:22.0

JAVA设计模式 之 观察者模式的更多相关文章

  1. 理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适 ...

  2. java设计模式之观察者模式以及在java中作用

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependen ...

  3. java设计模式02观察者模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 这里主要讲一下学习内置观察者的记录,在JA ...

  4. java设计模式之观察者模式

    观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...

  5. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  6. JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

  7. JAVA设计模式 之 观察者模式(JDK内置实现)

    简介:使用JAVA内置的帮你搞定观察者模式. 1. 先把类图放在这里: (1). Observable类追踪所有的观察者,并通知他们. (2). Observer这个接口看起来很熟悉,它和我们之前写的 ...

  8. java设计模式之观察者模式(9)

    Java观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象.这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者 ...

  9. java设计模式:观察者模式

    package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...

随机推荐

  1. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  2. Tomcat_Java Web_内存溢出总结

    在抛出内存溢出错误的时候,一般都会提示内存泄露的种类,一般也都是按照区域进行划分: 1. 堆(heap)内存泄漏java.lang.OutOfMemoryError: Javaheap space:大 ...

  3. 磁盘里的B,MB,GB,TB储存单位是怎么换算大小的?

    磁盘里的B,MB,GB,TB是怎么换算大小的? 1TB=1024GB1GB=1024MB1MB=1024KB1KB=1024Byte 注:Byte就是B也就是字节KB是千字节MB是兆GB是吉字节 即千 ...

  4. (总结)Nginx配置文件nginx.conf中文详解

    #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...

  5. B2B电子商务网站技术框架

    一 设计原则 电子商务平台总体结构的设计应从体系.功能.信息.过程等各个方面保证整个电子商务平台总体目标的实现,以提高市场竞争能力.总体结构的设计应考虑以下设计原则: 快速响应原则:商机稍纵即逝,网站 ...

  6. SOCKADDR_IN

    在windows/linux下有下面结构: sockaddr结构 struct sockaddr { unsigned short sa_family;/*addressfamily,AF_xxx*/ ...

  7. 药企信息sop

    中国药品生产企业 http://db.yaozh.com/shengchanqiye 全球药品生产企业 http://db.yaozh.com/quanqiuqiye

  8. Ctrl+Scroll改变所有Editor的缩放比例 (Code::Blocks)

    Settings > Editor > Zooming resizes all editors

  9. CentOS 7 AMD64安装nginx和mysql

    NGINX: rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.8.0-1.el7.ngx.x86_64.rpm 查看: ...

  10. 最近这么火的iOS视频直播

    快速集成iOS基于RTMP的视频推流 http://www.jianshu.com/p/8ea016b2720e iOS视频直播初窥:高仿<喵播APP> http://www.jiansh ...