简介:

观察者模式是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. 初始化Git的配置

    如何使用Git上传项目代码到github http://blog.csdn.net/llf369477769/article/details/51917557

  2. cobbler工作流分析

    官网 http://cobbler.github.io/ 介绍 Cobbler是一个快速网络安装linux的服务,而且在经过调整也可以支持网络安装windows.该工具使用python开发,小巧轻便, ...

  3. CSS3的transition动画功能

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Apache和Nginx配置支持苹果ATS方法

    什么是ATS功能? ATS是iOS9和OS X El Capitan的一个新特性.开启该功能后,ATS对使用NSURLConnection, CFURL或NSURLSession 等APIs 进行的网 ...

  5. C++中int,float,string,char*的转换(待续)

    //float转string char a[100]; float b = 1.234; sprintf(a, "%f", b); string result(a); //int转 ...

  6. ASP------<input type="file"/>上传文件

    界面代码(注意:runat="Server"和input file中name一定要有) <html xmlns="http://www.w3.org/1999/xh ...

  7. 用sql 语句给字段添加描述

    用sql 语句给字段添加描述 IF not exists (SELECT * FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', ...

  8. PHP实现观察者模式

    <?php //php设计模式观察者模式 /** 被观察者 */ class user implements SplSubject{ public $lognum; public $hobby; ...

  9. 初学Memcached安装及使用(CentOS7)

    1.yum install memcached安装memecached 2.chkconfig memcached on设置memcached开机启动 3.service memcached star ...

  10. JavaScript排序算法——快速排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...