文档章节

设计模式学习笔记之观察者模式

潇潇王子
 潇潇王子
发布于 2016/05/15 11:48
字数 1071
阅读 3
收藏 0
点赞 2
评论 0

观察者模式

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

    观察者模式中,分为两种模式。

    模式,即主题对象向观察者对象推送状态值,不管观察者对象是否需要,并且推送全部数据或者部分数据。

    模式,即主题对象通知观察者对象状态值已改变,观察者根据自己需要决定是否主动到主体对象中获取详细信息。

    两种模式的比较

    1、推模型是假定主题对象知道观察者需要的数据;而拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递给观察者,让观察者自己去按需要取值。

    2、推模型可能会使得观察者对象难以复用,因为观察者的update()方法是按需要定义的参数,可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能提供新的update()方法,或者是干脆重新实现观察者;而拉模型就不会造成这样的情况,因为拉模型下,update()方法的参数是主题对象本身,这基本上是主题对象能传递的最大数据集合了,基本上可以适应各种情况的需要。

 

    说明:

    1、观察者模式将观察者和主题(被观察者)的对象分离开,实现了两者的松耦合。提高了应用程序的可维护性和重用性;

    2、JAVA API 内置有观察者模式。位于java.util包,包含有最基本的Observer接口与Observable类,分别对应观察者和主题;

    3、主题仅需要把实时的状态值更新给观察者即可,而不需要知道观察者怎样处理数据或者其他细节。

    场景:

    1、对于一个对象的状态值需要实时更新到其他任何几个对象。如气象站检测的天气数据,要实时更新给气象网站的布告板。

/**

 * 主题类接口。

 * 用来定义注册观察者、移除观察者、通知更新等方法

 * @author xiabaike

 */

public interface Subject {

 

    /**

     * 注册观察者

     * */

    public void registerObserver(Observer o);

 

    /**

     * 移除观察者

     * */

    public void removeObserver(Observer o);

 

    /**

     * 当状态改变时,调用此方法,通知所有观察者

     * */

    public void notifyObservers();

}

/**

 * 观察者类接口。

 * 当主题状态发生改变时,主题会把这些状态值当做方法的参数,传送给观察者。

 * @author xiabaike

 * */

public interface Observer {

 

    /**

     * 当主题状态发生改变时,主题会把这些状态值当做方法的参数,传送给观察者

     * 所有观察者都必须实现此方法,以实现观察者接口

     * */

    public void  update(float temp, float humidity, float pressure);

 

}

/**

 * 展示。在布告板上显示内容 

 * */

public interface DisplayElement {

 

    /**

     * 当布告板需要显示时,调用此方法

     * */

    public void display();

 

}

/**

 * 天气数据类。产生更新状态值,并通知布告板观察者

 * */

public class WeatherData implements Subject{

 

    // 用来存放所有的观察者

    private List<Observer> observerList;

 

    private float tempPerature;

    private float humidity;

    private float pressure;

 

    public WeatherData() {

        observerList = new ArrayList<Observer>();

    }

 

    public void registerObserver(Observer o) {

        observerList.add(o);

    }

 

    public void removeObserver(Observer o) {

        if(observerList.contains(o)) {

            observerList.remove(o);

        }

    }

 

    public void notifyObservers() {

        for(int i = 0; i < observerList.size(); i++) {

            observerList.get(i).update(tempPerature, humidity, pressure);

        }

    }

 

    /**

     * 当从气象站得到更新观测值时,通知观察者

     * */

    public void setMeasurements(float temperature, float humidity, float pressure) {

        this.tempPerature = temperature;

        this.humidity = humidity;

        this.pressure = pressure;

        notifyObservers();

    }

}

/**

 * 具体布告板实现类。获取状态值,并展示

 * */

public class CurrentConditionsDisplay implements Observer, DisplayElement{

 

    private float tempPerature;

    private float humidity;

    private float pressure;

    private Subject subject;

 

    public CurrentConditionsDisplay(Subject subject) {

        this.subject = subject;

        this.subject.registerObserver(this);

    }

 

    public void update(float temp, float humidity, float pressure) {

        this.tempPerature = temp;

        this.humidity = humidity;

        this.pressure = pressure;

        display();

    }

 

    public void display() {

        System.out.println("Current conditions: " + tempPerature +", "+ humidity +", "+ pressure);

    }

}

/**

 * 主类,模拟气象站产生检测数据,并更新给布告板

 * */

public class WeatherStation {

 

    public static void main(String[] args) {

        WeatherData subject = new WeatherData();

        CurrentConditionsDisplay observer = new CurrentConditionsDisplay(subject);

        subject.setMeasurements(1, 2, 3);

    }

}

 

 

参考资料:《Head First 设计模式》

                   http://www.cnblogs.com/itTeacher/archive/2012/12/03/2800129.html

                   http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

© 著作权归作者所有

共有 人打赏支持
潇潇王子
粉丝 1
博文 1
码字总数 1071
作品 0
海淀
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

设计模式学习笔记之-代理模式

代理模式中,客户不会直接调用目标对象而是通过一个代码对象,客户调用代理对象代理对象去调用目标对象,起到对象与对象间的隔离作用。有时候我么不想直接访问目标对象,有时候我们不能直接访...

申文波 ⋅ 03/05 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

设计模式之禅(第2版).epub

【下载地址】 本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领...

winter730 ⋅ 05/16 ⋅ 0

js策略模式《JavaScript设计模式与开发实践》阅读笔记

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且是它们可以相互替换。 策略模式可以避免代码中的多重判断条件。 策略模式很好的体现了开放-封闭原则,将一个个算法(解决方...

RoyLuo ⋅ 05/19 ⋅ 0

Java经典设计模式-结构型模式-适配器模式(Adapter)

适配器模式 适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的...

Idea ⋅ 01/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 11分钟前 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 24分钟前 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 27分钟前 ⋅ 0

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 40分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 56分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 今天 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 今天 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 今天 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 今天 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部