目录

前言

UML类图

观察者模式的设计要点及应用场景

观察者模式的应用

其他


前言

        观察者模式也称作监听模式,即观察与被观察的关系,比如你在烧开水时看它有没有开,你就是观察者,水就是被观察者。

观察者模式是指对象之间一对多的依赖关系,每当那个特定对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新

观察者模式是对象的行为模式。有的地方称作的发布-订阅模式模型-视图模式源-监听器模式从属者模式等,当你看到这种叫法时,不要觉得陌生,它们都是观察者模式。

观察者模式可以有任意多个观察者对象同时监听某一个对象。监听某个对象的叫观察者(Observer),被监听的对象叫被观察者(Subject) 。被观察者对象在内容或状态发生改变时,会通知所有观察者,使它们能自动更新自己的信息。

UML类图

观察者模式的demo代码框架可表示成如下图所示:

被观察者类中包含addObserver()delObserver()notifyObservers()三个方法,前两个用于添加和删除观察者,后一个用于在内容或状态变化时通知所有的观察者。其代码示例如下:

public abstract class Observable {//定义一个观察者数组private Vector<Observer> obsVec = new Vector<Observer>();//增加一个观察者public void addObserver(Oberver obs){this.obsVec.add(obs);}//删除一个观察者public void delObserver(Observer obs){this.obsVec.remove(obs);}//通知所有观察者public void notifyObservers(){for (Observer obs:this.obsVec){obs.update();}}
}

具体的被观察者有自己的业务逻辑,同时它会定义对哪些事件进行通知。其代码如下所示:

public class ObservableImpl extends Observable {//具体的业务public void doSomething(){/*do something 业务逻辑代码模块部分*/super.notifyObservers(); //通知部分}
}

观察者接收到消息后,即进行update()操作,对接收到的信息进行处理。观察者一般是一个接口,每一个实现该接口的类都是一个具体的观察者。其代码如下:

 public interface Observer{//更新方法public void update();
}

在调用时,直接创建被观察者类和观察者类即可,如下示例:

//创建被观察者
Observable subject = new Observable ();
//创建观察者
Observer obs = new Observer();
//添加到列表
subject.addObserver(obs);
//被观察者开始动作
subject.doSomething();

观察者模式的设计要点及应用场景

在设计观察者模式时要注意以下几点:

  • 要明确谁是观察者,谁是被观察者。明白了关注对象,问题也就清楚了;
  • Observable在发送广播通知时,无须指定具体的Observer,观察者可以自己决定是否要订阅Observable的通知;
  • 被观察者至少有三个方法: 添加监听者、删除监听者和通知监听者;观察者至少有一个方法:更新方法。

观察者模式的应用场景如下:

  • 一个对象的数据或状态更新需要其它对象同步更新时;
  • 系统存在事件多级触发时;
  • 一个对象仅需要将自己的更新通知给其它对象而不需要知道其它对象细节时,如消息推送;
  • 跨系统的消息交换场景,如通信过程中的消息队列处理机制。

观察者模式的应用

观察者模式根据其侧重还可分为推模型拉模型

        推模型:被观察者对象向观察者推送主题的详细信息,不管观察者是否需要,推送的信息通常是主题对象的全部或部分数据。这种模型在实现时,会把被观察者对象中的全部或部分信息通过 update 的参数传递给观察者(update(Object obj) ,通过 obj 参数传递)。

如某应用 App 的服务要在凌晨1:00开始进行维护,1:00-2:00期间所有服务将会暂停,这里你就需要向所有的 App 客户端推送完整的通知消息:“本服务将在凌晨1:00开始进行维护,1:00-2:00期间所有服务将会暂停,感谢您的理解和支持!” 不管用户想不想知道,也不管用户会不会在这段期间去访问,消息都需要被准确无误地通知到。这就是典型的推模型的应用。

        拉模型:被观察者在通知观察者的时候,只传递少量关键信息。如果观察者需要更具体的信息,由观察者主动到被观察者对象中获取,相当于是观察者从被观察者对象中拉数据。这种模型在实现时,会把被观察者对象自身通过 update 方法传递给观察者(update(Observable observable ),通过 observable 参数传递)。

如某应用 App 有新的版本推出,则需要发送一个版本升级的通知消息,而这个通知消息只会简单地列出版本号和下载地址,如果你需要升级你的 App 还需要调用下载接口去下载安装包完成升级。这其实也可以理解成是拉模型。

推模型和拉模型,更多的是语义和逻辑上的区别,在代码实现的过程中,完全可以写成同时支持两种模型的通用参数形式。

观察者模式还可用于网络中的客户端和服务器,比如手机中APP消息推送,服务端是被观察者,各手机APP是观察者,一旦服务器有数据更新,就会被推送到客户端。只不过在这个系统中,服务器与客户端是两套完全不同的代码,它们是通过网络接口进行通讯的,因此,在学习设计模式时,应着重领悟其设计思想,而不应局限于代码层面。

下图示例了观察者模式的概括图。

其他

GOF23/ObserverMain.java at master · liuchaoOvO/GOF23 · GitHub

设计模式之观察者模式(监听模式)相关推荐

  1. 1.设计模式中监听模式(观察者模式)(Python实现)

    目录 1.什么是监听模式 2.监听模式设计思想 3.监听模式的框架模型 4.分别用框架模型和不用框架模型来解决下面的例子 5.模型说明 6.监听模式根据侧重可以分为推模型和拉模型 7.账号异常登录检测 ...

  2. 软件设计模式——监听模式

    摘要 本博文主要是介绍监听模式的原理和应用场景. 案例介绍 庄小焱毕业后留在了的城市,开始了沪漂的生活.但刚刚毕业的他身无绝技.包无分文,为了生活只能住在高桥镇的小村庄,每天坐着程序员专线(10号线) ...

  3. 【转】第01课:生活中的监听模式——一坑爹的热水器

    用程序来模拟生活 从剧情中思考监听模式 监听模式 监听模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 推模型和拉模型 应用场景 [故事剧情] 刚刚大学毕业的 Tony 只身来到北京 ...

  4. 第01课:生活中的监听模式——一坑爹的热水器

    用程序来模拟生活 从剧情中思考监听模式 监听模式 监听模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 推模型和拉模型 应用场景 [故事剧情] 刚刚大学毕业的 Tony 只身来到北京 ...

  5. 设置树莓派的无线网卡为监听模式(monitor)

    先使用命令查看无线网卡的名字: ifconfig 结果如下: eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 1 ...

  6. 策略模式,状态模式,监听模式之间的区分。

    把这三个放在一起区分,最主要的原因是这三种模式有共同点,就是都是把行为进行抽象. 1.策略模式一种最简单的.一种策略,当前只能有一个.. 2.状态模式可以说是链接起来的策略模式.强调的是各个策略实体类 ...

  7. 查看无线网卡是否支持监听模式

    查看无线网卡是否支持监听模式 在实施无线渗透测试时,通常需要将无线网卡设置为监听模式,来监听经过其网卡的所有流量.大学霸IT达人对于很多用户,都不知道如何确定自己的无线网卡是否支持监听,结果浪费大量时 ...

  8. 设置USB无线网卡为监听模式大学霸IT达人

    设置USB无线网卡为监听模式大学霸IT达人 当用户实施无线网络渗透时,设置无线网卡为监听模式是必不可少的操作.大学霸IT达人信息安全技术大讲堂通常情况下,用户会遇到各种问题,如网卡不支持,网络接口找不 ...

  9. JMS调用IBM MQ监听模式

    最近几天一直纠结于监听模式.在监听模式下遇到了两个问题. 1.消息接收者不关闭竟然收不到消息. 2.在监听模式下,每次只收一条消息,即使设定了监听,也是只收到一条消息 今天就针对这两个问题作出解答. ...

最新文章

  1. 读写测试_UFS3.0手机闪存测试曝光 读写速度足以秒杀超极本!
  2. 做专才能做强做大——从OA、协同之争说起
  3. 【技术教程】SequoiaDB对接Kafka
  4. mysql 优化方法_Mysql的优化方法介绍
  5. Linux-ubuntu18.04 终端命令ping,ssh
  6. 信息学奥赛一本通(1029:计算浮点数相除的余)
  7. 7 FI配置-财务会计-定义字段状态变式(总账科目组)
  8. 人生苦短,Python值得!这些Pandas隐藏小技巧你知道吗?
  9. NOIP201501金币
  10. linux内存管理(六)-伙伴分配器
  11. 阿里正在使用一种更灵活的软件集成发布模式
  12. SQL SERVER 2008的GEOMETRY类型
  13. Cocos2d-X开发中国象棋《三》開始场景的实现
  14. 学校计算机教室自查报告,学校专用教室自查报告范文
  15. linux使用tar命令,Linux的tar命令使用简介
  16. 我的世界boat运行库JAVA10_我的世界boat运行库
  17. 论文阅读《SHINE: Signed Heterogeneous Information Network Embedding for Sentiment Link Prediction》
  18. ps -ef 命令解析
  19. Arduino 和LCD1602液晶屏 I2C接口实验
  20. Nginx nginx.conf配置文件详解

热门文章

  1. [Vue warn]: Duplicate keys detected: ‘user‘. This may cause an update error. 解决方法
  2. Kubeadm-K8s1.20-高可用部署-详细-生产环境(四)
  3. Html+JS+Css 实现动物赛跑随机速度
  4. 从微信谈起,如何优化互联网APP心跳机制——孙宇彤
  5. 小程序微信支付功能逻辑
  6. JS实现上传图片的三种方法并实现预览图片功能
  7. matlab 向量的复制,MATLAB:复制向量’n’次
  8. 永磁同步电机矢量控制二更
  9. VC++ 开发PC版微信,CWeixin 类
  10. PROE4.0二次开发基视频教程从入门到精通教程