前言

代码来源于生活,更加高于生活。设计模式让我们的生活更加的方便。观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找人看着,可能没有更好的方法了,观察者模式的思想就是本人不用亲自盯着变化,当这些东西变化了,会通知本人了解情况。下面采用Observer Pattern进行实现。

内容

精华:

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

原则:

为交互对象之间的松耦合设计而努力。松耦合设计更有弹性,更能应付变化。

UML图部分:

DEMO部分:


说明:左半部分接口和一个类,分别定义了流程中用到的方法,注册、更新、通知、删除等,具体类做了具体的实现。

<span style="font-family:KaiTi_GB2312;font-size:18px;">/*
* author:zhoulitong
*/
interface Subject {
public void registerObserver(Observer o);//注册一个观察者
public void removeObserver(Observer o);//移除一个观察者
public void notifyObservers();//通知观察者
} //weatherdata现在实现了subject接口
class WeatherData implements Subject{ private ArrayList observers;
private float temperature;
private float humidity;
private float pressure; public WeatherData(){
observers = new ArrayList();
} //注册观察者
public void registerObserver (Observer o){
observers.add(o);//此处定义observes为泛型类型,这种类型本身有增加删除方法;
} //删除观察者
public void removeObserver(Observer o){
int i = observers.indexOf(o);//定义i为观察者的下标号
//如果存在观察者,就执行删除的方法
if(i>=0){
observers.remove(i);
}
} //具体通知观察者内容
public void notifyObservers(){
//i为一群观察者的每一个观察者
for(int i = 0; i < observers.size();i++){
Observer observer = (Observer)observers.get(i);
observer.update(temperature, humidity,pressure);
}
} //通知观察者
public void measurementsChanged(){
notifyObservers();
} //设定数据,并提示更新了数据
public void setMeasurements(float temperature, float humidity, float perssure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = perssure;
measurementsChanged();
}
}</span>

说明:右半部分功能为接受通知后要更新数据和显示数据。

<span style="font-family:KaiTi_GB2312;font-size:18px;">interface Observer{
public void update(float temp, float humidity, float pressure);
}
interface DisplayElement{
public void display();
} //此布告板实现了Observer接口,所以可以从WeatherData对象中获得改变
class CurrentConditionsDisplay implements Observer,DisplayElement{
private float temperature;
private float humidity;
private Subject weatherData; public CurrentConditionsDisplay(Subject weatherData){
this.weatherData = weatherData;
weatherData.registerObserver(this);
} public void update(float temperature, float humidity, float pressure){
this.temperature = temperature;
this.humidity = humidity;
display();
} public void display(){
System.out.println("Current conditions: "+ temperature + "F degrees and " + humidity + "% humidity");
}
}</span>

客户端:实例化一个weatherData对象和多个观察者对象,进行注册

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class WeatherStation{
public static void main(String[] args){
WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
}
}</span>

小结

在java中util里面有JDK自带的观察者Observer包,采用java自带的观察者也可以达到相同的功能,实现接口的时候,实现不同的更新方法就可以了。

感谢您的宝贵时间···

【Java】Observer Pattern的更多相关文章

  1. 【Java】Strategy Pattern

    前言 如果说,商场打折针对不同的时节,比如双十一.圣诞节.春节这些值得促销的好日子,进行不同程度的降价打折从而获得最大程度上的收益,如果有一群鸭子,只会游泳.嘎嘎叫,但是某一天某种类型的鸭子学会了飞, ...

  2. 【Java】-NO.20.Exam.1.Java.1.001- 【1z0-807】- OCEA

    1.0.0 Summary Tittle:[Java]-NO.20.Exam.1.Java.1.001-[1z0-807] Style:EBook Series:Java Since:2017-10- ...

  3. 【Java】-NO.16.EBook.4.Java.1.007-【疯狂Java讲义第3版 李刚】- Java基础类

    1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.007-[疯狂Java讲义第3版 李刚]-  Java基础类 Style:EBook Series:J ...

  4. 【Java】-NO.11.Java.1.Log4j.1.001-【Log4j Manual】-

    1.0.0 Summary Tittle:[Java]-NO.11.Java.1.Log4j.1.001-[Log4j2 Manual]- Style:Java Series:Log4j Since: ...

  5. 数据结构与算法【Java】03---栈

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  6. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  7. 【Java】推断文件的后缀名

    这本来不是一个问题,利用框架本来有的方法.或者File类的getPath()方法,取出要推断文件路径.或者getName()方法取出文件路径,成为一个String字符串如果为fileName之后,再对 ...

  8. 【JAVA】【NIO】3、Java NIO Channel

    Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...

  9. 【JAVA】【NIO】5、Java NIO Scatter / Gather

    标题手段Java NIO该分散体浓缩 Java NIO内置支持分散与收集.的概念主要用于信道分散聚集的读写. 读出的分散体的一个通道被读多个数据buffer在.因此.数据分散到多个buffer中. 对 ...

随机推荐

  1. 机器学习:SVM(非线性数据分类:SVM中使用多项式特征和核函数SVC)

    一.基础理解 数据:线性数据.非线性数据: 线性数据:线性相关.非线性相关:(非线性相关的数据不一定是非线性数据) 1)SVM 解决非线性数据分类的方法 方法一: 多项式思维:扩充原本的数据,制造新的 ...

  2. 转:InnoDB Page Structure(InnoDB页面结构详解)

    InnoDB Page Structure(InnoDB页面结构详解) 此转载自登博的博客,给大家分享.

  3. Java程序开发中的简单内存分析

    首先说明内存总体分为了4个部分, 包括 1.stack segment (栈区存储基本数据类型的局部变量,对象的引用名) 2.heap segment(堆区,一般用于存储java中new 出来的对象) ...

  4. 如何平衡MMO游戏

    转自:http://blog.sina.com.cn/s/blog_9f56a65f01013eti.html 前言 这是一篇出自国外博客“Elder Game”的一篇文章,笔者觉得里面很多东西说的很 ...

  5. git 学习 多个提交用同一个commit

    git add .git commit --amend(连续按连个ZZ)git push -f origin ibm_branch(命令行可能不好用,用IDEA force push好用)

  6. 开发工具:sublime text3安装Vue语法高亮插件

    一.将插件克隆到Sublime的packages目录 1.下载并解压插件(或直接git命令clone),得到vue-syntax-highlight-master文件夹 插件地址:https://gi ...

  7. Rails的静态资源管理(五)—— 自定义 Asset Pipeline

    官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...

  8. 问题:Oracle 树形遍历;结果:使用oracle进行遍历树操作

    使用oracle进行遍历树操作   1:首先数据库中表必须是树形结构的 2:super_department_id 为 department_id 的父节点编号 3:以下语句的执行结果是:depart ...

  9. 浅析大数据的技术生态圈(Hadoop,hive,spark)

    大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可 ...

  10. 常用linux配置文件

    /etc/hosts:用户IP与域名的对应解析表/etc/sysconfig/network:机器名.网卡启动.网关等配置/etc/fstab:记录开机自动挂载的文件系统/etc/rc.local:开 ...