什么是观察者模式

一句话,观察者模式(Observer Pattern)就是一种 “发布者-订阅者” 的模式。有时也被称为 “模型-视图”模式、“源-监听者”模式等。在这种模式中,由一个目标对象来管理所有依赖与它的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知。

观察者模式类图

比如你最近在追一个美剧《生活大爆炸》,假设著名在线视频网站某狐买下独家版权,在线更新与播放。于是你天天等啊等啊,等它的更新通知一来,你就去看那些最新的视频。

观察者模式示例代码

下面的代码块中是全部的代码,实际操作中应当按注释创建相应的类再将方法写入对应的类中

// Subject 主题接口
public interface Subject {public void registerObserver(Observer o);public void removeObserver(Observer o);public void notifyAllObservers();
}// 观察者接口
public interface Observer {public void update(Subject s);
}// 视频网站某狐 实现 Subject 接口
public class VideoSite implements Subject{// 观察者列表 以及 更新了的视频列表private ArrayList<Observer> userList;private ArrayList<String> videos;public VideoSite(){userList = new ArrayList<Observer>();videos = new ArrayList<String>();}@Overridepublic void registerObserver(Observer o) {userList.add(o);}@Overridepublic void removeObserver(Observer o) {userList.remove(o);}@Overridepublic void notifyAllObservers() {for (Observer o: userList) {o.update(this);}}public void addVideos(String video) {this.videos.add(video);notifyAllObservers();}public ArrayList<String> getVideos() {return videos;}public String toString(){return videos.toString();}
}// 实现观察者,即看视频的美剧迷们
public class VideoFans implements Observer {private String name;public VideoFans(String name){this.name = name;}@Overridepublic void update(Subject s) {System.out.println(this.name + ", new videos are available! ");// print video listSystem.out.println(s);}
}//  测试一下
public class Main {public static void main(String[] args) {VideoSite vs = new VideoSite();vs.registerObserver(new VideoFans("LiLei"));vs.registerObserver(new VideoFans("HanMeimei"));vs.registerObserver(new VideoFans("XiaoMing"));// add videosvs.addVideos("Video 1");//vs.addVideos("Video 2");}
}

运行结果为:

可能有同学会问,为什么打印出了[Video 1],我们来看类 VideoSite 中的 toString() 方法 返回的是 ArrayList 的 videos 对象,当 notifyAllObservers() 方法中调用 update()方法,传递 this 参数的时候,相当于传递了 videos 的值。具体可以参考JAVA中toString方法的作用。

观察者模式的应用

前面已经说了,观察者模式也可以理解为 “源-监听者” 模式,这种应用就太多了。举个简单的例子就是各种 listener,比如当你有一个按键,你肯定要给这个按键添加监听事件(listener)来完成指定动作吧,这就是一种应用。

Java学习笔记之设计模式(6)观察者模式相关推荐

  1. java工作笔记021---Java设计模式_观察者模式_事件驱动模式

    技术交流QQ群[JAVA,C,.NET,BigData,AI]:170933152 这个模式现在,觉得越来越有用了, 发现在一些springCloud项目中也有用的,一些前端,net, 后端java的 ...

  2. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  3. java学习笔记十三

    11. 凡是继承了FilterOutputStream或FilterInputStream的类都是过滤流,也就是说他们不能直接跟目标(键盘,文件,网络等,节点流可以)数据打交道,只能包装 Intput ...

  4. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  5. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  6. 准备写java学习笔记

    准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267

  7. Java学习笔记--StringTokenizer的使用

    2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...

  8. java学习笔记12--异常处理

    java学习笔记系列: java学习笔记11--集合总结 java学习笔记10--泛型总结 java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 j ...

  9. Java学习笔记(十)--控制台输入输出

    输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...

  10. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

最新文章

  1. 如何用XGBoost做时间序列预测?
  2. 事务的隔离级别【防止忘记自用的】
  3. matlab mle pci为nan,matlab - 使用mle()估计自定义分布的参数 - 堆栈内存溢出
  4. Java减少依赖_去掉JAVA部分依赖的事例
  5. HDU 2896 病毒侵袭【AC自动机】
  6. 如何在ASP.NetCore增加文件上传大小
  7. c++中计算2得n次方_七上,一元一次方程,知识点综合学霸笔记在手
  8. layer模态窗简单使用
  9. 互联网行业的体面隐退 | 畅言
  10. Bailian4016 班级排名【稳定排序】
  11. 强化学习进阶【逆强化学习】
  12. 台式计算机的打印机端口,台式电脑怎么连接网络打印机
  13. img html 文件怎么打开,img文件怎么打开?img文件用什么打开?
  14. 权限提升+权限维持+痕迹清理
  15. shell脚本:自动更新动态域名的IP地址
  16. Stealing Machine Learning Models via Prediction APIs研读报告
  17. springCloud项目不能向EurekaServer 注册多个EurekaClient时(端口不一致)方法及踩坑经历
  18. 工作以后,我们如何实现自我提升
  19. [java]已知文件 source.txt 中的内容如下,其中,username、yonghu 都表示用户名,password、mima都表示密码,level、dengji都表示等级
  20. Unity URP 2020 设置DOTS

热门文章

  1. 关于网页设计工具的50个新的资源和灵感
  2. PHP cookie和session的分析
  3. MySQL使用EXPLAIN查看SQL的执行计划
  4. Object对象的内存布局学习总结
  5. JVM初识之垃圾回收机制(GC)
  6. Spring Cloud Eureka详解
  7. JTA分布式事务处理
  8. makefile编写---.c .cpp 混合编译makefile 模板
  9. 【转载】C++操作符的优先级
  10. JavaScript中Switch语句支持字符串类型数据