1. 观察者设计模式

观察者把自己“绑定”至目标,当目标发生变化时,目标“通知”观察者,然后观察者进行相应操作。你有没有觉得这种设计模式更像发布-订阅设计模式?其实这种设计模式和发布-订阅模式最大的区别就是观察者模式是目标发生变化,目标直接“通知”观察者;而发布-订阅模式中发布者和订阅者之间并没有直接联系,中间通过“消息中心”连接。

3. 代码实现

3.1 目标类和观察者接口代码如下。

3.2 观察者两个实现类:StringObserverImpl和IntegerObserverImpl,代码如下。

3.3 测试类及运行结果如下。

附录:代码

package observer;import java.util.ArrayList;public class Goal {private Object msg;private final ArrayList<Observer> observers = new ArrayList<>();public Object getMsg() {return msg;}public void notify(Object msg) {this.msg = msg;// 目标发送消息时,调用观察者的方法(相当于通知观察者),观察者根据消息执行相应操作for(Observer ob: observers){ob.execute();}}public ArrayList<Observer> getObservers() {return observers;}
}package observer;public interface Observer {void observer(Goal goal);void execute();
}package observer;public class StringObserverImpl implements Observer {private Goal goal;@Overridepublic void observer(Goal goal) {this.goal = goal;// 当前观察者观察了当前目标,之后目标要向观察者发送通知,// 所以要将当前观察者加入目标的观察者列表中this.goal.getObservers().add(this);}@Overridepublic void execute() {// 不同观察者接收不同的消息if(goal.getMsg() instanceof String){System.out.println("StringObserverImpl recive " + goal.getMsg());}}
}package observer;public class IntegerObserverImpl implements Observer {private Goal goal;@Overridepublic void observer(Goal goal) {this.goal = goal;this.goal.getObservers().add(this);}@Overridepublic void execute() {if(goal.getMsg() instanceof Integer){System.out.println("IntegerObserverImpl recive " + goal.getMsg());}}
}package observer;public class ObserverTest {public static void main(String[] args) {// 创建String消息观察者和Integer消息观察者以及目标StringObserverImpl stringObserver = new StringObserverImpl();IntegerObserverImpl integerObserver = new IntegerObserverImpl();Goal goal = new Goal();// 让String观察者和Integer观察者观察目标goalstringObserver.observer(goal);integerObserver.observer(goal);// 目标分别发送两种类型消息goal.notify("abc");goal.notify(123);}
}

常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别相关推荐

  1. 『设计模式』80年代的人们就已经领悟了设计模式-- 发布者/订阅者模式 (包括发布者/订阅者模式和观察者模式的区别)

    23种设计模式+额外常用设计模式汇总 (持续更新) 发布-订阅模式 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为 ...

  2. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  3. JavaScript 设计模式之观察者模式与发布订阅模式

    前言 在软体工程中,设计模式(design pattern)是对软体设计中普遍存在(反复出现)的各种问题,所提出的解决方案. 设计模式并不直接用来完成程式码的编写,而是描述在各种不同情况下,要怎么解决 ...

  4. 行为设计模式 - 观察者设计模式

    行为设计模式 - 观察者设计模式 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用.在观察者模式中,监视另一个对象状态的对象称为Observe ...

  5. 创建型设计模式:模板设计模式/观察者设计模式/策略设计模式

    目录 设计模式的设计原则 模板设计模式 观察者模式 策略设计模式 设计模式的设计原则 依赖倒置:高层模块不应该依赖低层模块,两者都应该依赖抽象: 抽象不应该依赖具体实现,具体实现应该依赖于抽象: (记 ...

  6. JAVA设计模式第四讲:行为型设计模式

    设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案.本文以面试题作为切入点,介绍了设计模式的常见问题.我们需要掌握各种设计模式的原理.实现.设计意图和应用场景, ...

  7. 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)

    园子里讲设计模式的太多了,最近我也在学设计模式,把我自己练的一些代码整理下,写个.NET设计模式学习笔记来让自己在设计模式的功底更深一层. 记得金庸小说里风清扬教令狐冲的时候,说过独孤九剑的总纲,无招 ...

  8. Redis 学习笔记十 发布者订阅者模式与生产者消费者模式

    消息队列有两种场景 生产者消费者:一个消息只能有一个消费者 发布者订阅者:一个消息可以被多个消费者收到 redis从2.0版本开始支持pub/sub. 而Producer/Consumer是借助于re ...

  9. java 设计模式 示例_Java中的中介器设计模式-示例教程

    java 设计模式 示例 中介者模式是行为设计模式之一 ,因此它处理对象的行为. 中介器设计模式用于在系统中不同对象之间提供集中式通信介质. 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互 ...

最新文章

  1. 发通知 PendingIntent 中Intent 内容没有更新
  2. 软件工程师不可不知的10个概念
  3. 更精准地生成字幕!哥大Facebook开发AI新框架,多模态融合,性能更强
  4. 实战并发编程 - 03基于不可变模式解决并发问题_1
  5. 同程旅行基于 RocketMQ 高可用架构实践
  6. php transport,PHPMailer - PHP email transport class
  7. 计时器Chronometer和时钟(AnalogClock和DigitalClock)
  8. VMware虚拟机克隆CentOS后网卡修改方法
  9. [CQOI2015]选数(数论分块+杜教筛)
  10. 达摩院最新AI技术助力天猫双11,提供接近真人的语音交互体验
  11. 【PHP】网站防止QQ拦截防红跳转代码
  12. Git-简单安装与使用
  13. python部署thrift服务以及客户端
  14. 谷歌首页被别的网站篡改
  15. 简记_高频变压器基础知识(一)
  16. Arduino应用开发——手机APP控制LED
  17. unity WebGL射线检测
  18. vue项目+高德地图
  19. VS C++项目报错warning C4199: ……use /Zc:twoPhase-
  20. 2.8 mm / 4 mm / 6 mm / 8 mm 焦距的镜头分别能监控多大范围?

热门文章

  1. SAP SD-销售模式-寄售(客户寄售)
  2. ABAP算术运算函数
  3. SAP - 银企直联
  4. 根据当前时间如何找到上月的第一天和最后一天?
  5. ERP实施中要重视物料编码的规则
  6. ABAP [div '/'] 的区别与妙用
  7. android gridview item添加checkbox,手把手教你实现GridView中Checkbox全选
  8. mysql connector api_mysql connector c++ 1.1 API初步体验
  9. mysql5720_Mysql内置功能《五》 函数
  10. git公有转私有_【IT新手之路】客户端组件化之私有库搭建