前言

代码来源于生活,更加高于生活。设计模式让我们的生活更加的方便。观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找人看着,可能没有更好的方法了,观察者模式的思想就是本人不用亲自盯着变化,当这些东西变化了,会通知本人了解情况。下面采用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. Spring Boot发布和调用RESTful web service

    Spring Boot可以非常简单的发布和调用RESTful web service,下面参考官方指导体验一下 1.首先访问 http://start.spring.io/ 生成Spring Boot ...

  2. 2015 浙江省赛 Beauty of Array (思维题)

    Beauty of Array Edward has an array A with N integers. He defines the beauty of an array as the summ ...

  3. Python No module named pkg_resources

    好记性不如烂笔头. I encountered the same ImportError today while trying to use pip. Somehow the setuptools p ...

  4. Java中Exception的种类

    通常来讲,Java中的异常会被分为三种: Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身. Runtime Exception: 运行时异常往往与环境有关,编译时无法检查,并且可 ...

  5. C#引用类库时出现黄色三角加感叹号的处理

    C#引用类库时出现黄色三角加感叹号的处理方法 一个C#项目 在引用中有个引用项上有个黄色三角加感叹号 导致报错 类库的目标框架不一致,修改成一样就可以了. 选中类库右击属性:“目标框架”,修改成与引用 ...

  6. 问题:oracle 字符串转换成日期;结果:[oracle] to_date() 与 to_char() 日期和字符串转换

    to_date("要转换的字符串","转换的格式")   两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...

  7. 部署和调优 2.1 squid正向代理

    安装squid yum install -y squid Squid 官方网站为 http://www.squid-cache.org 打开注释掉的 cache_dir ufs / 缓存目录的位置,大 ...

  8. xftp的简单使用

    1.下载并安装Xftp工具.打开Xftp工具,点击“新建”. 2.在“新建会话属性”中选择“名称”为主机命名,在“主机”栏输入主机IP,“协议”和“端口号”使用sftp和22,在“用户名”和“密码“栏 ...

  9. 5-EasyNetQ之Publish(黄亮翻译)

    EasyNetQ支持的最简单的消息模式是发布/订阅.这个模式是一个极好的方法用来解耦消息提供者和消费者.消息发布者只要简单的对世界说,"这里有些事发生" 或者 "我现在有 ...

  10. NoSQL概述