目录

  • 角色组成

    • 抽象主题(Subject)
    • 具体主题(Concrete Subject)
    • 抽象观察者(Observer)
    • 具体观察者(Concrete Observer)
  • 具体实现
  • 总结

观察者模式(发布-订阅模式)是一种行为型模式,定义一系列对象之间的一对多关系,当一个对象改变、更新状态时,依赖它的都会收到通知改变或者更新。

在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

角色组成

抽象主题(Subject)

它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

具体主题(Concrete Subject)

将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有注册过的观察者发出通知。

抽象观察者(Observer)

为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

具体观察者(Concrete Observer)

实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

具体实现


抽象主题(被观察者)

public interface Subject {/*** 注册观察者* @param observer*/void registerObserver(Observer observer);/*** 移除观察者* @param observer*/void removeObserver(Observer observer);/*** 通知所有观察者*/void notifyAllObserver();
}

具体主题

public class SubjectImpl implements Subject {private List<Observer> observerList = new ArrayList<>();private String status;@Overridepublic void registerObserver(Observer observer) {observerList.add(observer);}@Overridepublic void removeObserver(Observer observer) {observerList.remove(observer);}@Overridepublic void notifyAllObserver() {for (Observer observer : observerList) {observer.process(status);}}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}
}

抽象观察者

public interface Observer {void process(String status);
}

具体观察者

public class ObserverA implements Observer {@Overridepublic void process(String status) {System.out.println("A观察者收到了状态变更为【"+status+"】的通知");}
}
public class ObserverB implements Observer {@Overridepublic void process(String status) {System.out.println("B观察者收到了状态变更为【"+status+"】的通知");}
}

更改状态,来通知到其他观察者

        SubjectImpl subject = new SubjectImpl();//注册观察者AObserver observerA = new ObserverA();subject.registerObserver(observerA);//注册观察者BObserver observerB = new ObserverB();subject.registerObserver(observerB);subject.setStatus("进行中");System.out.println("被观察者状态变为【进行中】,正在通知观察者们...");//通知所有观察者subject.notifyAllObserver();
被观察者状态变为【进行中】,正在通知观察者们...
A观察者收到了状态变更为【进行中】的通知
B观察者收到了状态变更为【进行中】的通知

总结

  1. 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变。
  2. 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,不希望这些对象是紧密耦合的。
  3. 观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。

你可以在这里获取相关代码:设计模式-Observer模式

转载于:https://www.cnblogs.com/xuxiaojian/p/11563139.html

设计模式-Observer模式相关推荐

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

    模式定义 定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新 类图 应用场景 当更改一个对象的状态可能需要更改其他对象,并且实际 ...

  2. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  3. 我的实用设计模式之Observer模式

    写这篇文章主要想总结自己的工作经验,温故而知新.为什么叫做实用设计模式,所谓的实用模式就是说这些模式在本人的实际工作中使用过的,而且本人相对熟悉的,经验认为这些模式的使用能给系统带来有效改善.这些模式 ...

  4. 移动项目开发笔记(.Net下的观察者(Observer)模式)

    下面是一些关于这个Observer的基本一些概念,在很多地方都能看到,这里我归纳这这里便于以后查阅: 一.发布订阅模型(pub-sub) 二.动机(Motivation) 在软件构建过程中,我们需要为 ...

  5. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  6. java获取jsp 组件,利用Observer模式解决组件间通信问题-JSP教程,Java技巧及代码

    1. 问题的提出 以前做一个界面的时候常常会遇到这样的尴尬情况:希望保留各个独立的组件(类),但又希望它们之间能够相互通信.譬如windows中的explorer,我们希望鼠标点击左边是树型目录的一个 ...

  7. Observer模式在J2EE中的实现

    引言: 设计模式是经验的文档化.它是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述.更通俗的来说,它是一个问题/解决方案对.一旦我们掌握了设计模式,就等于拥有了一支强有力的专家队伍.它 ...

  8. 重温Observer模式--热水器·改(转载)

    引言 在 C#中的委托和事件 一文的后半部分,我向大家讲述了Observer(观察者)模式,并使用委托和事件实现了这个模式.实际上,不使用委托和事件,一样可以实现Observer模式.在本文中,我将使 ...

  9. java observer模式_Java观察者模式(Observer)详解及应用

    Java观察者模式(Observer)详解及应用 (2011-12-15 14:03:30) 标签: 杂谈 Java观察者模式(Observer)详解及应用 由于网站带有弱sns功能,因此需要设计关注 ...

最新文章

  1. zigzag扫描matlab,ZIGZAG扫描的MATLAB实现 | 学步园
  2. 几乎所有的成功都是厚积薄发
  3. vs生成qt moc文件
  4. java 无法执行export 命令_模块中的export、import以及复合模式的使用方法
  5. java xsd 解析 xml文件_Java针对XSD文件验证XML文件的最佳方法是什么?
  6. 认真研究下HTML之id、name、form、submit
  7. 如何使frame能居中显示
  8. html写弹出告警状态,基于日志报警插件 elastalert 实现告警(示例代码)
  9. nginx 配置示例_Nginx位置指令示例
  10. 233.数字1的个数
  11. 微信红包管理数据库mysql_莫晓东 - 微信红包数据库架构演变
  12. 第一节:(2)逻辑芯片工艺特性指标
  13. rebuild node-sass npm install
  14. ES6读书笔记(下)
  15. 使用新版FLIR (FLIR_ADAS_v2) 训练Faster RCNN模型
  16. 关于浏览器的深入解析都在这31张图里!
  17. ubuntu查看系统信息命令
  18. 使用 JS 访问服务器地址实现下载文件
  19. 数据库每分钟运行监控SQL
  20. nexus-基本使用

热门文章

  1. PHP对请求时间范围条件的判断
  2. Angular\Vue解决页面数据加载时出现{{message}}闪烁的情况
  3. 【Linux开发】linux设备驱动归纳总结(七):2.内核定时器
  4. 移动界面设计点滴:工欲善其事,必先利其器[转]
  5. 算法学习:后缀数组(SA)
  6. luogu 5471 [NOI2019]弹跳 KDtree + Dijkstra
  7. SQL Server 2005 的版本和组件[转载]
  8. css中那些容易被我们程序猿所忽略的选择器
  9. 添加sudo权限脚本
  10. cocos2d-x游戏引擎核心(3.x)----启动渲染流程