场景:读者订杂志,订报纸,当有新的期刊和版本来了,读者怎么知道?

1. 模式介绍

public class Subject {//用来保存注册的观察者对象 private List<Observer> observers = new ArrayList<Observer>();public void attach(Observer observer) {observers.add(observer);}public void detach(Observer observer) {observers.remove(observer);}//通知所有注册的观察者对象 protected void notifyObservers() {for(Observer observer : observers){observer.update(this);}}
}public class ConcreteSubject extends Subject { private String subjectState;    //示意,目标对象的状态 public String getSubjectState() {return subjectState;}public void setSubjectState(String subjectState) {this.subjectState = subjectState;//状态发生了改变,通知各个观察者this.notifyObservers();}
}//观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象
public interface Observer {//更新的接口 public void update(Subject subject);
}public class ConcreteObserver implements Observer { private String observerState;  //示意,观者者的状态 public void update(Subject subject) {// 具体的更新实现//这里可能需要更新观察者的状态,使其与目标的状态保持一致observerState = ((ConcreteSubject)subject).getSubjectState();}
}

2. 应用到场景

public interface Observer {//被通知的方法,直接把报纸的内容推送过来   public void update(String content);
}public class Reader implements Observer{//读者的姓名 private String name;public void update(String content) {//这是采用推的方式System.out.println(name+"收到报纸了,阅读先。内容是==="+content);}public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Subject {// 用来保存注册的观察者对象,也就是报纸的订阅者 private List<Observer> readers = new ArrayList<Observer>();//报纸的读者需要先向报社订阅,先要注册 public void attach(Observer reader) {readers.add(reader);}//报纸的读者可以取消订阅 public void detach(Observer reader) {readers.remove(reader);}// 当每期报纸印刷出来后,就要迅速的主动的被送到读者的手中, protected void notifyObservers(String content) {for(Observer reader : readers){reader.update(content);}}
}public class NewsPaper extends Subject{ private String content;    //报纸的具体内容public String getContent() {return content;}//示意,设置报纸的具体内容,相当于要出版报纸了 public void setContent(String content) {this.content = content;//内容有了,说明又出报纸了,那就通知所有的读者notifyObservers(content);}
}public class Client {public static void main(String[] args) {//创建一个报纸,作为被观察者NewsPaper subject = new NewsPaper();//创建阅读者,也就是观察者Reader reader1 = new Reader();reader1.setName("张三");Reader reader2 = new Reader();reader2.setName("李四");Reader reader3 = new Reader();reader3.setName("王五");//注册阅读者subject.attach(reader1);subject.attach(reader2);subject.attach(reader3);//要出报纸啦subject.setContent("本期内容是观察者模式");}
}

《研磨设计模式》chap12 观察者模式observer(1)模式简介相关推荐

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

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

  2. 《研磨设计模式》chap10 中介者模式Mediator(1)简介

    1. 使用场景 如果电脑没有主板,各个配件的关系为 有主板后: 2. 中介者模式简介:各对象通过中介者来交互 //Mediator.java public interface Mediator { p ...

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

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

  4. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  5. 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)

    观察者模式(OBSERVER),又称发布-订阅(Publish-Subscribe),依赖(Dependents),通过定义对象间的一对多的依赖关系,达到当一个对象的状态发生改变时,所有依赖于它的对象 ...

  6. 锈才学设计模式之 —— 观察者模式(Observer Pattern)

    锈才学设计模式之  -- 观察者模式 观察者模式:定义对象的一对多的关系,这样当主题对象改变状态时,其它的观察者对象都会收到通知,自动更新. 说明: 在真实世界中存在很多类似的模型,比如:订报纸,找中 ...

  7. 《研磨设计模式》chap11 代理proxy模式

    场景:需要查询所有用户数据,不能翻页都显示出来,只显示姓名,在需要的情况下,点击某个用户的姓名出现详细信息. 1. 正常编码:仅查询当前数据 public static void main(Strin ...

  8. Android开发中常见的设计模式深入浅出——观察者模式Observer

    ##最近老大写的Android项目里用到了RxBus然后我就去百度了 让我先了解RxJava 然后RxJava又是由观察者模式的变种写的 所以打算从头学一遍!!! 观察者模式 Observer 顾名思 ...

  9. 《研磨设计模式》chap12 观察者模式observer(2)模式介绍

    1. 两个步骤 . 注册 . 通知 2. 推模型和拉模型 推模型 目标对象主动向观察者推送目标的详细信息,不管观察者是否需要,推送的信息通常是目标对象的全部或部分数据,相当于是在广播通信. 拉模型 目 ...

最新文章

  1. 9-分析事物问题并编写 Utils 文件
  2. tf.variable_scope和tf.name_scope的用法
  3. Realtek 8192cu 支持 Android Hotspot
  4. 小型车、中型车、大型车、重型车的区分和定义见下表:
  5. 百万局对战教AI做人,技术解读FPS游戏中AI如何拟人化
  6. python wordpress自定义字段获取_WordPress 自定义字段(Custom Fields)详细介绍和使用...
  7. iOS SQLite函数总结
  8. c51 嵌入汇编语言,在C51中嵌入汇编
  9. Codeforces Round #422(Div 2)
  10. C#:泛型(Generic)
  11. 20145302张薇 《信息安全系统设计基础》第14周学习总结
  12. 【C++快速入门】面向对象篇
  13. 利用java实现浏览器功能 jdic
  14. 装linux系统为什么会黑屏_Ubuntu安装时出现黑屏问题的解决
  15. 领峰:个人如何投资白银炒白银有哪些方法
  16. java里面怎么开根号_新手求解呀!!!!!!!怎么开根号,为嘛我开不了
  17. vbs恶意脚本_vbs恶意软件删除程序的分析
  18. 网络安全架构:如何理解P2DR模型
  19. 正则表达式总结(待续)
  20. 阿里副总裁人设翻车:30岁成AI顶尖科学家,但我很懒

热门文章

  1. idea 中 git 修改了文件却无法提交(No Changes detected)
  2. 服务器log文件清理,服务器日志切割清理工具(LogCutter)
  3. html中基本选择器的优先级,CSS_CSS中的各种选择器与样式优先级小结,优先级:由高到低(从上到下)- phpStudy...
  4. java 不支持fork_为什么Java forkbomb不会导致StackOverflowError?
  5. 数据中心节能环保政策汇总分析:2022年新建大型数据中心PUE需达到1.4以下
  6. 14种冷热源及空调系统特点介绍
  7. 内存分段分页机制理解_深度干货 | 真棒! 20 张图揭开内存管理的迷雾,瞬间豁然开朗...
  8. 成功解决ValueError: Data is not binary and pos_label is not specified
  9. ML之catboost:基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)
  10. DataScience:数据可视化的简介(意义+六大优势)、使用工具之详细攻略