文档章节

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

潇潇王子
 潇潇王子
发布于 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
海淀
私信 提问
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
设计模式学习笔记之-代理模式

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

申文波
03/05
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
10/26
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
4
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
18
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部