观察者模式: 定义了对象之间的一对多依赖,这样一来。当一个对象(被观察者)改变状态时,它的全部依赖者(观察者)都会收到通知并自己主动更新。

在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。

用这个模式, 你能够改变依赖主题状态的对象。却不必改变主题。这叫提前规划。

主题和观察者都使用接口:观察者利用主题的接口向主题注冊。而主题利用观察者的接口通知观察者。这样能够让两者之间运作正常,有同一时候具有松耦合的长处。

观察者模式利用“组合”将很多观察者组合进主题中。对象之间的这样的关系不是通过继承产生的,而是在执行时利用组合的方式而产生的。

以下来看观察者设计模式的一个完整Demo

package observer;
/*** 被观察者接口* @author Arvon**/
public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();
}
package observer;
/*** 观察者接口* @author Administrator**/
public interface Observer {public void update(float temp,float humidity, float pressure);
}
package observer;
/*** 布告板接口* @author Administrator**/
public interface DisplayElement {public void display();}
package observer;import java.util.ArrayList;
import java.util.List;/*** 被观察者的实现类 * 主题* @author Administrator**/
public class WeatherData implements Subject {private List<Observer> observersList;private float pressure;private float humidity;private float temp;public WeatherData() {super();observersList = new ArrayList<Observer>();}@Overridepublic void registerObserver(Observer o) {observersList.add(o);}@Overridepublic void removeObserver(Observer o) {int i = observersList.indexOf(o);if(i>=0)observersList.remove(i);}@Overridepublic void notifyObservers() {for (Observer observer : observersList) {observer.update(temp, humidity, pressure);}}public void setMeasurements(float temp, float humidity, float pressure){this.temp = temp;this.humidity = humidity;this.pressure = pressure;messurementsChanged();}/*** 当新的天气数据送来时。通知观察者*/private void messurementsChanged() {// TODO Auto-generated method stubnotifyObservers();}}
package observer;
/*** 眼下天气状况 布告板* @author Administrator**/
public class CurrentConditionsDisplay implements Observer, DisplayElement {private float pressure;private float humidity;private float temp;private WeatherData weatherData;public CurrentConditionsDisplay(WeatherData weatherData) {super();this.weatherData =weatherData;weatherData.registerObserver(this);}@Overridepublic void display() {System.out.println("Current conditions:" + temp + "F Degrees and "+ humidity + "% humidity");}@Overridepublic void update(float temp, float humidity, float pressure) {this.temp = temp;this.humidity = humidity;this.pressure = pressure;display();}}
package observer;
/*** 气候统计* @author Administrator**/
public class StatisticsDisplay implements DisplayElement, Observer {@Overridepublic void update(float temp, float humidity, float pressure) {// TODO Auto-generated method stub}@Overridepublic void display() {// TODO Auto-generated method stub}}
package observer;
/*** 天气预报* @author Administrator**/
public class ForecastDisplay implements DisplayElement, Observer {@Overridepublic void update(float temp, float humidity, float pressure) {// TODO Auto-generated method stub}@Overridepublic void display() {// TODO Auto-generated method stub}}
package observer;
/*** 測试类* @author Administrator**/
public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay cDisplay  = new CurrentConditionsDisplay(weatherData);weatherData.setMeasurements(80.0f, 65, 30.4f);}}

程序的输出 :  Current conditions:80.0F Degrees and 65.0% humidity

转载于:https://www.cnblogs.com/clnchanpin/p/7079617.html

设计模式: 自己手动实现一个观察者设计模式相关推荐

  1. 《Head First设计模式》批注系列(一)——观察者设计模式

    最近在读<Head First设计模式>一书,此系列会引用源书内容,但文章内容会更加直接,以及加入一些自己的理解. 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(List ...

  2. 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)

    什么是设计模式:[每天一个java设计模式(零)] - 设计模式基本概念及七大设计原则 创建型模式 工厂模式:[每天一个java设计模式(一)] - 工厂模式 抽象工厂模式: [每天一个java设计模 ...

  3. 【每天一个java设计模式(十八)】 - 观察者模式

    观察者模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模型-视图模式,它是对象行为型模式. 观察者 ...

  4. 【每天一个java设计模式(十七)】 - 状态模式

    在状态模式中,类的行为是基于它的状态改变的,允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示各种状态的对象和一个行为 ...

  5. 【每天一个java设计模式(二十三)】 - 访问者模式

    在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者 ...

  6. 【每天一个java设计模式(十五)】 - 命令模式

    命令模式是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 命令模式也就是一个 ...

  7. 【每天一个java设计模式(十四)】 - 解释器模式

    解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文. 解释器模式主要包括以下几个部分: 抽象表达式角色:定义解释器的接口,约定解释 ...

  8. Servlet→简介、手动编写一个Servlet、使用MyEclipse编写一个Servlet、Servlet生命周期、路径编写规范、初始化参数、MVC设计模式

    手动编写一个Servlet 使用MyEclipse编写一个Servlet Servlet生命周期 路径编写规范 初始化参数 MVC设计模式 企者不立:跨者不行. 自见者不明: 自是者不彰: 自伐者无功 ...

  9. 探究netty的观察者设计模式

    javadoc笔记点 观察者的核心思想就是,在适当的时机回调观察者的指定动作函数 我们知道,在使用netty创建channel时,一般都是把这个channel设置成非阻塞的模式,这意味着什么呢? 意味 ...

最新文章

  1. 玩转OpenVswitch 简介
  2. 【计算机图形学】实验:VB.net环境下的图形裁剪完整实验操作流程
  3. 推荐一个数据可视化网站,提供绘图创意
  4. Mybatis入门(一)
  5. Stata:机制检验,如何判断是不是遮掩效应?
  6. Android基础入门教程——2.5.2 Notification(状态栏通知)详解
  7. LeetCode-Python-275. H指数 II
  8. 蓝色理想:建站初期如何低成本运营网站
  9. 35岁以上程序员求职没市场?互联网大厂100道Android面试题助你冲关金三银四!终局之战
  10. 最强神作 Crysis深度剖析与优化指南
  11. 如何实现调用阿里云三方的api
  12. Tesla M40 使用分享
  13. 电商数仓:用户行为数据仓库(一)数据仓库建设和技术选型
  14. 网络流之最大流算法——EK算法(通俗讲解)
  15. 胡策day 10.26 T2 人、镜子与墙
  16. 概念结构设计、逻辑结构设计、物理设计的区分
  17. es模糊查询与精准查询混用、距离排序、返回距离
  18. Antlr4:使用grun命令,触发NoClassDefFoundError
  19. 20xx绿色水墨创意学术报告PPT模版素材
  20. 人工智能软件表现抢眼,几乎准确预测了奥密克戎病毒的复杂结构

热门文章

  1. 将BYTE[] 输出到edit控件中
  2. F# ≥ C# (Record)
  3. 这些片段在Android编程中很有用 (ZT)
  4. [原]动态创建Web控件制做计算器
  5. JavaScript 精粹 基础 进阶(4)对象
  6. kubernetes-1.11.0集群部署之master集群 (二)
  7. HDU 6354 Everything Has Changed(余弦定理)多校题解
  8. 《跃迁 从技术到管理的硅谷路径》读后感
  9. 搭建git for windows服务器(100%可以成功)【转】
  10. 常用插值算法介绍(二)