设计模式(Design pattern)是什么?它是一套由四人组(The Gang of Four, [1]的作者)总结出来的软件设计框架。其目的是为了提高代码的可重用性,增强系统的可维护性和代码的易读性。在四人组的《Design Patterns》一书中提到了23中最常用的设计模式,大致可以分为三大类:
  1. 创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式;
  2. 结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥连接模式、组合模式、享元模式;
  3. 行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

  关于上面23中设计模式的大概介绍可以参考博客[2]。

从上面的分类可以看出观察者模式是一种对象的行为型模式。它也被称之为发布-订阅(Publish-Subscribe)模式、模型视图(Model-View)模式或源-监听器(Source-Listener)模式[3]。通俗的说,观察者模式涉及到(至少)两个对象。其一是观察者,其二是被观察者。例如在一个RSS订阅系统中,发布方充当被观察者角色,而订阅方则充当了观察者角色。一般来说,观察者与被观察者是多对一的关系。即多个监听器可以同时监听某一主题对象。当主题对象状态发生改变时,监听器对象也会自动的更新自身状态。
这篇博客主要是从一个实际的例子出发,来简单的说明Java(Android)、Objective-C(iOS)、C#(Windows Phone)三种面向对象编程语言对观察者模式的实现。

观察者模型实例之烧开水

  从一个烧开水的例子出发。现在我们有个热水器,我们用它来烧开水。在烧水的过程中,显示器和扬声器都一直监视水温。显示器将水温显示在显示屏上。另外,当水温超过90度时,扬声器开始发出警告,提示水快烧开。

Java实现

  Java对观察者类的支持,主要体现在Observable类和Observer接口。

1. java.util.Observable类 = 被观察者

Observable类的主要方法:

public class Observable {void setChanged(); //设置被观察者的状态已经被改变void clearChanged(); //清除被观察者状态的改变,此时再调用hasChanged()将返回falsevoid addObserver(Observer observer);int countObservers();void deleteObserver(Observer observer);void deleteObservers();boolean hasChanged();void notifyObservers();void notifyObservers(Object arg); // 参数一般设定为被改变的属性
}

热水器类继承自Observerable类,作为一种具体的被监控对象:

public class Heater extends Observable {private int temperature;// get方法,返回水温public int getTemperature(){return temperature;}// set方法,设置水温public void setTemperature(int temperature){this.temperature = temperature;}// boilWater方法,烧水public void boilWater(){for(int i = 30; i <= 100; i++){this.setTemperature(i);this.setChanged();this.notifyObservers(this.getTemperature());this.clearChanged();}}
}

2. java.util.Observer接口 = 观察者

  Observer接口只有一个抽象方法需要被具体的观察者实现。

public interface Observer{void update(Observable observable, Object arg); //这里的arg即Obserbale类里的notifyObservers(Object arg)传过来的参数
}

  Note:当被观察者调用nofityObservers(*)方法时,会根据被观察者的hasChanged()方法来判断它的状态是否被改变。如果改变,则观察者调用update方法。否则不调用(即不更新)。

  显示器和扬声器作为具体的热水器水温监视者,都需要实现Observer接口。对于显示器,它的update方法作用就是更新显示的水温。对扬声器,它的update方法则是在水温超过90度时发出警告。具体代码如下:

// 显示器
public class Displayer implements Observer {public void update(Observable observable, Object arg){display((int)arg);}public void display(int temperature){System.out.println("Current Temperature is: " + temperature  + " degree.");}
}// 扬声器
public class Alertor implements Observer {public void update(Observable observable, Object arg){int temperature = (int) arg;if(temperature > 90){  alarm();}}public void alarm(){System.out.println("Warning: Temperature is over 90 degree!" );}
}

3. 测试类

public class TestObserver{public static void main(String[] args){// 生成设备Heater heater = new Heater();Displayer displayer = new Displayer();Alertor alertor = new Alertor();// 添加订阅 - 重点(!!!)
        heater.addObserver(display);heater.addObserver(alertor);// 烧水
        heater.boilWater();}
}

4. 将上面的3个步骤统一起来,写到一个文件中如下:文件名TestObserver.java

import java.util.Observable;
import java.util.Observer;public class TestObserver {public static void main(String[] args){// 生成设备Heater heater = new Heater();Displayer displayer = new Displayer();Alertor alertor = new Alertor();// 添加订阅
        heater.addObserver(displayer);heater.addObserver(alertor);// 烧水
        heater.boilWater();}
}class Heater extends Observable {private int temperature;// get方法,返回水温public int getTemperature(){return temperature;}// set方法,设置水温public void setTemperature(int temperature){this.temperature = temperature;}// boilWater方法,烧水public void boilWater(){for(int i = 30; i <= 100; i++){this.setTemperature(i);this.setChanged();this.notifyObservers(this.getTemperature());  // 只需传入监视器感兴趣的变量this.clearChanged();}}
}// 显示器
class Displayer implements Observer {public void update(Observable observable, Object arg){display((int)arg);}public void display(int temperature){System.out.println("Displayer: Current Temperature is: " + temperature  + " degree.");}
}// 扬声器
class Alertor implements Observer {public void update(Observable observable, Object arg){int temperature = (int) arg;if(temperature > 90){  alarm();}}public void alarm(){System.out.println("Alertor: Warning: Temperature is over 90 degree!" );}
}

最后的输出结果为:

Displayer: Current Temperature is:  30  degree.
Displayer: Current Temperature is:  31  degree.
Displayer: Current Temperature is:  32  degree.
...
Displayer: Current Temperature is:  90  degree.
Displayer: Current Temperature is:  91  degree.
Alertor: Warning: Temperature is over 90 degree!
Displayer: Current Temperature is:  92  degree.
Alertor: Warning: Temperature is over 90 degree!
...
Displayer: Current Temperature is:  99  degree.
Alertor: Warning: Temperature is over 90 degree!
Displayer: Current Temperature is:  100  degree.
Alertor: Warning: Temperature is over 90 degree!

总结

第一次写技术博客感觉比较费劲。原以为一个下午能把三种实现方法都写完的,结果只写完了Java部分。后续的Objective-C 和C#部分计划明天下午搞定。敬请期待。

欢迎交流和讨论^_^ ~ 如有任何问题,请发送到邮箱:fengfu0527@gmail.com

[1]. 《Design Patterns: Elements of Reusable Object-Oriented Software》

[2]. Java之美之设计模式,链接:http://bolg.csdn.net/zhangerqing/article/details/8194653

[3]. 《Java与模式》

转载于:https://www.cnblogs.com/fengfu-chris/p/3959580.html

设计模式之观察者模式(Java)相关推荐

  1. Java 设计模式之观察者模式

    一.了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 典型的问题比如报社,只要你是他们的订户,他们 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. java观察者模式本质_6.[研磨设计模式笔记]观察者模式

    1.定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新. 2.解决问题 --订阅报纸 看起来订阅者是直接根有据打交道,但实际上,订阅者的订阅数据 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  6. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  7. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  8. JAVA架构之路(设计模式之观察者模式)

    设计模式之观察者模式 定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 核心原理: 1.被观察者中维护一个观察者对象列表 2.观察者可新增可可移 ...

  9. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  10. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

最新文章

  1. Tornado 类与类组合降低耦合
  2. PyCharm安装及配置
  3. [Apple开发者帐户帮助]二、管理你的团队(3)删除团队成员
  4. php mysql orm_PHP ORM框架与简单代码实现(转)
  5. 20050611:超级伙伴?
  6. Qt TextEdit 不自动换行 取消换行
  7. 影院售票系统-----一个让你有成就感的小项目,只有一丢丢哦
  8. tableau如何生成HTML文件,Tableau 入门
  9. 球动画设计HTML5,html5 canvas炫彩运动小球动画特效
  10. 二叉树翻转/镜像 (Java实现)
  11. 鸿蒙的境界是什么,“鸿蒙”究竟为何物?扶桑树上的神祇,还是混沌的状态?...
  12. 注册测绘师资格拟认定人员公示名单
  13. 纳税服务系统四(角色模块)【角色与权限、角色与用户】
  14. 数学乐 --- 科学计数法(个人学习笔记)
  15. babel5升级到babel6总结
  16. IT行业吃香技能TOP榜,欢迎补充
  17. 用JS写右下角烦人的弹窗小广告
  18. go语言实现的一个基于go-zero框架的微服务网盘系统butane-netdisk
  19. VM15安装MacOS10.15.1系统
  20. 追风筝的人 第七章

热门文章

  1. bzoj 3528: [Zjoi2014]星系调查
  2. cmd进入控制Mysql出现乱码的问题
  3. 情爱难剪断,菩提树下悟佛缘
  4. Hadoop日志分析工具——White Elephant
  5. 一次性从linux发送多个文件到windows
  6. Java私塾的一些基础练习题(一)
  7. zoj 1406 Jungle Roads
  8. 诗与远方:无题(七十七)- 远方
  9. Spark GraphX算法 - PageRank算法
  10. python 发送邮件附件很慢_Python SMTP 发送带附件电子邮件