1.为什么要用到观察者模式,他能给我们什么好处。

   举个例子,一个老师,要布置作业,该如何通知班里的学生呢?第一种方法,去教室、食堂、厕所等地一个个找到学生,然后通知学生们作业。这种方法显然是不现实的。那我们在上学时,是如何得知作业的呢?首先所有学生到教室后,都听老师布置的作业。这样,解放了老师。这里用的这种思想,就是观察者模式。

2.我们来画一下上述的流程图:

  

3.代码实现如下:

  1)抽象观察者:

public interface Observer {/*** 接受消息*/public void update(String message);
}

  2)抽象被观察者:

public interface Subject{/*** 注册观察者*/public void registerObserver(Observer o);/*** 移除观察者*/public void removeObserver(Observer o);/*** 通知消息*/public void notifyObserver();}

  3)学生: 

public class Student implements Observer {private String name;  private String message; //观察者需要的消息public Student(String name) {this.name = name;}public void read() {System.out.println(name+"收到消息为:"+message);}//接受消息的实现
    @Overridepublic void update(String message) {this.message = message;read();}
}

  4)老师:

public class Teacher implements Subject {//注意这个List集合的泛型为Observer接口,设计原则:面向接口编程,而不是面向实现编程private List<Observer> list;//通知的内容private String message;//constructor
    Teacher() {list = new ArrayList<>();}@Overridepublic void registerObserver(Observer o) {list.add(o);}@Overridepublic void removeObserver(Observer o) {if (!list.isEmpty()) {list.remove(o);}}@Overridepublic void notifyObserver() {for(Observer observer : list) {observer.update(message);}}/*** 设置信息的时候就全都通知了*/public void setInfomation(String s) {this.message = s;System.out.println("服务更新消息:" + s);notifyObserver();}
}

  5)调用:

public class Main {public static void main(String[] args) {Teacher server = new Teacher();Observer zhaopd= new Student("zhaopd");Observer chenmy= new Student("chenmy");Observer chzh= new Student("chzh");server.registerObserver(zhaopd);server.registerObserver(chenmy);server.registerObserver(chzh);server.setInfomation("Java 是世界上最好的语言");System.out.println("-------------------");server.removeObserver(chzh);server.setInfomation("我说谎了");}
}

4.关于观察者模式和发布-订阅模式:

  我个人以为是不一样的...区别是一个发布-订阅有调度中心,观察者模式没有,相当于一个是老师在黑板上留言通知,一个是直接喊话通知。

转载于:https://www.cnblogs.com/zpdMulti/p/596957458_qq19.html

设计模式之观察者模式--中英文结合理解版相关推荐

  1. 设计模式---观察者模式介绍与理解

    设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...

  2. 设计模式之禅(第2版)

    网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击"普通下载" ...

  3. 【设计模式】观察者模式:一个注册功能也能使用到设计模式?

    人生在世如身处荆棘之中,心不动,人不妄动,不动则不伤,如心动则人妄动,伤其身,痛其骨,于是体会到世间诸般痛苦 目录 我的斗罗梦 悲催的小明 什么是观察者模式? 注册功能改造 异步非阻塞观察者模式 Ev ...

  4. 玩转设计模式(观察者模式)

    目录 玩转设计模式(观察者模式) 观察者模式在天气预报场景的应用 观察者模式在支付场景中的应用 观察者模式在数据订阅场景的应用 总结 玩转设计模式(观察者模式) 要写好代码,设计模式(Design P ...

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

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

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

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

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

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

  8. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

  9. 精读《设计模式 - Observer 观察者模式》

    Observer(观察者模式) Observer(观察者模式)属于行为型模式. 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 拿项目的 ...

最新文章

  1. 石墨烯新新新应用,MIT大规模生产细胞大小机器人,有感知能存储
  2. 数据仓库自动抽取:通过 SQL Server 企业管理器中的数据转换服务 (DTS) 设计器 创建 Analysis Services 处理任务...
  3. 【Clique Problem】
  4. Hadoop Writable机制
  5. Interview:算法岗位面试—10.15下午—上海某公司算法岗位(偏机器学习,合资制造行业)技术面试考点之电话面试—研究项目的技术考察
  6. Python:Selenium 1:浏览器驱动
  7. 使用 Python 5 年后,我转向了Go
  8. Kittle工具抽取文件出现乱码的情况解决方法
  9. java向有序数组里插数_Java向有序数组中插入一个元素,,使其仍按有序排列,并求出这个插入元素的下标...
  10. JAVA中整数类型数据溢出问题研究
  11. php7 断言,PHP7.2常用新特性和函数
  12. 小程序学习笔记(4)-猫眼电影案例
  13. python docx文档内容提取与写入(汇总)
  14. 计算机硬盘小影响,系统C盘容量太小有哪些危害?又要如何扩容呢?今天再说一遍!...
  15. 03.【python基础二】if判断语句之if-else、elif、if嵌套
  16. CMS企业建站的经验
  17. 【观察】戴尔易安信ECS:领跑企业级对象存储,背后的底蕴与底气
  18. linux pcf8563开发文档,linux下的i2c与时钟芯片pcf8563通信
  19. 基于docker实现openwrt软路由与OMV(NAS)应用
  20. 计算机考研只考一门“软件工程”的院校汇总

热门文章

  1. 集群系统 刀片服务器,刀片服务器集群原理
  2. 什么镜头最适合拍风景_35mm F1.8定焦镜头,拍人拍风景都可以!
  3. java基础(1)-几种获取类的扩展方式
  4. [虚树][树状数组][lca] Jzoj P5908 开荒
  5. 使用cocoaPods一键集成第三方登录(新浪微博,qq,微信)
  6. 使用selenium控制滚动条(非整屏body)
  7. 随机化算法-----模拟退火
  8. List和DataTable的Limit
  9. 假如有一款机器可以采集人的脑电波用于写作多好!
  10. 同事就是同事,职场没有兄弟姐妹