老板出差了,员工1、员工2..均放羊中。他们请求前台的秘书,当老板回来时通知自己,免得被Boss抓个现行。秘书想了想,说————嗯,这是观察者模式。

当一个对象的改变需要同时改变其它对象,而且它不知道具体有多少方法需要改变时,应该考虑使用观察者模式————摘自《大话设计模式》
 
 Ps:本例用Java类库中的Observable和Observer实现
 基本结构:
 ①、抽象通知者,接口
 抽象的通知方法

②、通知者,继承Observable
 通知方法,在该方法内条件判断setChange的执行与否,继而决定后续的notifyObservers是否执行

③、观察者,实现Observer接口
 覆写的update方法,当“通知者”的notifyObservers方法执行时,update被调用

④、调用者
 创建通知者A
 创建观察者B
 通过addObserver方法建立委托关系
 调用通知方法

代码演示:文章开篇的例子
 ①、抽象通知者#########################################

/*** 抽象的通知者 */
public interface Subject {public void setAction(String action); //设置行为public String getAction(); //获取行为public void inform();
}

②、通知者#########################################

/***  秘书,当老板回来时通知观察者*/
public class Secretary extends Observable implements Subject{private String action; //行为@Overridepublic void inform(){if(action!=null && !"".equals(action)){this.setChanged();//只有当改变发生时,即setChange方法被触发时,才调用下面的通知方法notifyObservers}this.notifyObservers();//调用各个观察者的update方法}@Overridepublic String getAction() {return action;}@Overridepublic void setAction(String action) {this.action = action;}
}

③、观察者#########################################

/***  观察者1,正在打魔兽 */
public class Member1 implements Observer{String name; //观察者姓名public Member1(String name){this.name = name;}public void stopGame(){ //停止游戏System.out.println(name+"请停止打魔兽,继续工作!");}@Overridepublic void update(Observable o, Object arg) {Subject sub = (Subject) o;System.out.print(sub.getAction()+","); //得到行为stopGame();}
}
/***  观察者2,正在大声谈笑*/
public class Member2 implements Observer{String name; //观察者姓名public Member2(String name){this.name = name;}public void stopNoise(){ //停止游戏System.out.println(name+"请停止喧闹,继续工作!");}@Overridepublic void update(Observable o, Object arg) {Subject sub = (Subject) o;System.out.print(sub.getAction()+",");  //得到行为stopNoise();}
}

④、调用者#########################################

public class Test {public static void main(String[] args) throws Exception {Secretary s = new Secretary();Member1 m1 = new Member1("张三"); //成员1Member2 m2 = new Member2("李四"); //成员2s.addObserver(m1); //成员1建立委托s.addObserver(m2); //成员2建立委托s.setAction("老板回来啦");s.inform(); //通知}
}

运行结果:
 老板回来啦,李四请停止喧闹,继续工作!
 老板回来啦,张三请停止打魔兽,继续工作!

转载于:https://www.cnblogs.com/suncoolcat/p/3327476.html

十一、观察者模式(Observable、Observer)相关推荐

  1. RxJava 设计理念 观察者模式 Observable lambdas MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. HeadFirst 设计模式(二)观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 在对象之间建立一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新. 设计原则 找出应用中可能需要变化之处,把它们独立出来, ...

  3. 设计模式--观察者模式(Observer)

    观察者模式(Observer) 在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变.例如,某种商品的物价上涨时会导致部分商家高兴,而消费者 ...

  4. 【设计模式】观察者模式(Observer)

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

  5. [译] Subject 和 Observable + Observer 的混淆指北[ Android RxJava2 ] ( 这什么鬼系列 ) 第八话...

    原文地址:Confusion between Subject and Observable + Observer [ Android RxJava2 ] ( What the hell is this ...

  6. C#设计模式之十六观察者模式(Observer Pattern)【行为型】

    C#设计模式之十六观察者模式(Observer Pattern)[行为型] 原文:C#设计模式之十六观察者模式(Observer Pattern)[行为型] 一.引言 今天是2017年11月份的最后一 ...

  7. 行为型设计模式(4)—— 观察者模式(Observer Pattern)

    文章目录 1.概述 2.实例 2.1 丑陋的设计 2.2 使用观察者模式 3.应用场景 4.优缺点 5.小结 参考文献 1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.观察者模式(O ...

  8. 【23种设计模式】观察者模式(Observer Pattern)

    个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客:这里是CSD ...

  9. 设计模式之观察者模式(Observable与Observer)

    1.什么是观察者模式 简单情形:有A.B.C.D等四个独立的对象,其中B.C.D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策. 上面的这种情形,就是观察者模式. 当然 ...

  10. 设计模式之-观察者模式(Observer Design Pattern)

    当你订阅一个感兴趣主题消息,内容发生任何变化时都能够得到通知,观察者模式对你是非常有帮助的.在观察者模式中,一个对象监控另一个对象的状态,那这个对象被称为观察者,被监视的对象被称为主题. 一个主题对象 ...

最新文章

  1. 2021年大数据Spark(四十九):Structured Streaming 整合 Kafka
  2. 来篇文章:Martin Fowler的设计已死中文版
  3. python 中numpy dot函数的使用方法
  4. codeigniter文件上传问题
  5. 有赞 Flink 实时任务资源优化探索与实践
  6. 关于WinCE中config.bib的问题
  7. ES6学习(新增字符串方法)
  8. SQL 内置排名函数 DENSE_RANK
  9. try-catch语句
  10. persevere的用法_persevere的用法是什么
  11. php伪静态规则生成,SEO工具箱:PHP自动生成PHPCMS伪静态规则.htaccess
  12. Hive 求全局Top N
  13. android 图片方向,Android图片处理:识别图像方向并显示实例教程
  14. 熵 机器学习_理解熵:机器学习的金标准
  15. B-S期权定价模型 Black Scholdz
  16. 排队论模型(三):M / M / s/ s 损失制排队模型
  17. myexcel导入导出数据
  18. 戴尔服务器r420系统安装系统,DELLR420+R720服务器raid+驱动安装教程.docx
  19. 苹果在旧设备中修复了两个 iOS 零日漏洞
  20. 做一名名企科学家,还是当一个终身教授,这是一个问题

热门文章

  1. 全网独家:LINUX登录桌面后,如何自动运行自己的应用程序
  2. pthread_mutex_unlock()出错
  3. 光干涉波谷,有可能低于绝对零度
  4. 测试的重要性:蚊子让快递柜的触摸失灵
  5. mysql返回的数据是什么格式_磁盘格式化后能恢复数据吗?先了解什么是格式化...
  6. rabbitmq python高性能开发_RabbitMQ工作队列实现高性能任务的负载分发[Python实例]...
  7. electron 里html不识别require_electron关于应用功能之旅(六)
  8. 2014年4月管理计算机应用,全国2014年4月自考管理系统中计算机应用真题
  9. 流类库——输入输出流控制详解
  10. React学习文档阅读(一)