【Java】Observer Pattern
前言
代码来源于生活,更加高于生活。设计模式让我们的生活更加的方便。观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找人看着,可能没有更好的方法了,观察者模式的思想就是本人不用亲自盯着变化,当这些东西变化了,会通知本人了解情况。下面采用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的更多相关文章
- 【Java】Strategy Pattern
前言 如果说,商场打折针对不同的时节,比如双十一.圣诞节.春节这些值得促销的好日子,进行不同程度的降价打折从而获得最大程度上的收益,如果有一群鸭子,只会游泳.嘎嘎叫,但是某一天某种类型的鸭子学会了飞, ...
- 【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- ...
- 【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 ...
- 【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: ...
- 数据结构与算法【Java】03---栈
前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...
- 【Java】代处理?代理模式 - 静态代理,动态代理
>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...
- 【Java】推断文件的后缀名
这本来不是一个问题,利用框架本来有的方法.或者File类的getPath()方法,取出要推断文件路径.或者getName()方法取出文件路径,成为一个String字符串如果为fileName之后,再对 ...
- 【JAVA】【NIO】3、Java NIO Channel
Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...
- 【JAVA】【NIO】5、Java NIO Scatter / Gather
标题手段Java NIO该分散体浓缩 Java NIO内置支持分散与收集.的概念主要用于信道分散聚集的读写. 读出的分散体的一个通道被读多个数据buffer在.因此.数据分散到多个buffer中. 对 ...
随机推荐
- HDU5468(dfs序+容斥原理)
Puzzled Elena Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- java代码异常普通的====
总结:对于各种流类, package com.da; //包括运行异常,和非运行异常 import java.io.*; public class ryl { public static void m ...
- Celery-4.1 用户指南: Security (安全)
简介 虽然Celery 编写的时候考虑了安全,但是它仍然应该认为是一个不安全的组件. 依据安全策略,你可以采取几个步骤使得你的 Celery 安装更加安全. 关注的领域 消息中间件 保障消息中间件不受 ...
- Solaris ssh配置主机间信任关系
假设需要配置从主机com00biiitf001登录主机ols00biiitf001时不需要密码,则采用以下步骤配置: com00biiitf001上产生公用/私有密钥对 $ ssh-keygen -t ...
- 如何删除offline数据文件/表空间上的分区
接上一篇"Oracle 10g RAC全库flashback " http://www.cnblogs.com/cqubityj/p/3265552.html 在打开数据库之前把2 ...
- 服务器启动时Webapp的web.xml中配置的加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- 0016_练习题d2
__author__ = 'qq593' #!/usr/bin/env python #-*- coding:utf-8 -*- #元素分类,有如下值集合[11,22,33,44,55,66,77,8 ...
- 剑指offer 39_二叉树的深度
#include <stdio.h> #include <malloc.h> typedef int Item; typedef struct node{ Item m_val ...
- jQuery-图片的放大镜显示效果(需要大小图)
1.default.aspx <%@ Page Language=.2em; height:.1em; text-align:center; font-size:128px;} .zxx_ ...
- Freemarker 使用注意事项
上次借助 Freemaker 模板引擎来动态构造 Kylin 访问的 SQL,在使用过程中,遇到了一些坑. ${} 输出变量时需要注意: 示例 WHERE shop_id = ${val} 里的 v ...