文档章节

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

潇潇王子
 潇潇王子
发布于 2016/05/15 11:48
字数 1071
阅读 3
收藏 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
海淀
Head First Design Pattern 读书笔记(1) 策略模式

Head First Design Pattern 读书笔记(1) Strategy Pattern 策略模式 这几天为了锻炼看英语文档的能力,开着有道硬着头皮看 《Head First Desgin Pattern》的原版书,顺便做下笔记,把里面提...

Tek_Eternal
2015/01/02
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

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

Carson_Ho
04/09
0
0
Happy 设计模式之工厂模式(Java)

闲暇之余学习设计模式。只是把我理解的整理成笔记,如果有不对的地方,请各位大牛指出。 工厂模式 1、简单工厂模式、 2、工厂方法模式、 3、抽象工厂模式、 下面首先介绍简单工厂模式: 先看...

豆芽菜橙
07/03
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
C#设计模式(2)——简单工厂模式

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

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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

angular 解决其他电脑不能访问的问题。

ng serve --host 0.0.0.0 --disable-host-check

miaojiangmin
今天
1
0
优酷视频文件怎么转换格式

  以前在优酷上下载视频都只是在手机上观看,但随着科技的发展,对于视频的要求也逐渐增多,不再只是观看视频那么简单,在精彩的部分还会将其单独分割出来,然后进行视频剪辑,可以做出我们...

萤火的萤火
今天
0
0
数据结构:散列

在一个数据结构中查找key元素,用顺序查找、二分查找都需要经过一系列关键之比较才能查找到结果,平均查找长度与数据量有关,元素越多比较次数就越多。 如果根据元素的关键字就能知道元素的存...

京一
今天
0
0
Apache RocketMQ 正式开源分布式事务消息

近日,Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消...

阿里云云栖社区
今天
30
0
使用JavaScript和MQTT开发物联网应用

如果说Java和C#哪个是最好的开发语言,无疑会挑起程序员之间的相互怒怼,那如果说JavaScript是动态性最好的语言,相信大家都不会有太大的争议。随着越来越多的硬件平台和开发板开始支持JavaS...

少年不搬砖老大徒伤悲
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部