观察者的前世今生

2024-05-10 03:08
文章标签 观察者 今生 前世

本文主要是介绍观察者的前世今生,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

观察者的前世今生

观察者是一个非常棒的消息通信机制模式,许多优秀的框架都使用了观察者模式的思想。

====================

观察者模式的前生

这里我想借着观察者,聊聊回调。因为这真的是一个有趣的东西。而它也正是观察者的前生。

我把回调理解为开发者的一个小进阶。为什么这么说呢?

回调解决了所有初级程序猿都会遇到棘手问题:

A → B   B → A  A调用B,B如何反过来调用A
新手通常都会使用静态变量来解决这个问题。

回调可以轻而易举的解决这个问题,但新手理解回调却是一个艰难的过程,因为这完全打破了固有的思维方式。其原因有二:

  • 接口可以理解为一种名实分离的概念。继承形象化的父子关系更容易被理解,接口就不那么容易了。因为它比较特殊,一个空空的东西……但其实将接口也认为是继承,理解起来就容易了一点。(所以回调你也可以用继承实现哦~)

  • Java的引用类似于简化版的指针,对新手也不是那么容易理解的东西。所以在回调中,就难去理解,我中有你,你中有我,你那里的我还是我这里的我吗?

难理解是真的,但真的理解了以后,在感叹的同时也会发现它还是很简单的。也对接口和JAVA的引用有了较深的理解。

观察者的优化建议

先说观察者的三种模式
  • 链式结构,一条触发链的结构。你通知我,我通知他。

  • 分发结构。通过观察者做消息或事件分发。

  • 单一回调(最简的回调也是一种观察者嘛)

优化
  • 观察者包装与分类

    传统的观察者模式,都是被观察者将观察者存于一个集合中,当需要发送消息时,通过遍历向每个观察者发消息。这是一种效率低下的行为,尤其观察者非常多的时候,可以通过一些方法将观察者分类,每次只遍历需要的一部分。

  • 异步分发。

    普通的消息分发都是按照顺序的,一旦中间有卡壳,那么后面的完蛋了。而且如果要求速度的话,建议异步分发。

  • 观察者的保存使用Set还是List

    如果有避免一个对象重复注册的需求,那么可以开始考虑使用Set,但到底用不用呢?

    Set可以更快的查重,List可以更快的遍历。

    如果注册需求大于消息分发需求,使用Set。消息分发需求大于注册需求,使用List。而往往后者的情况更多一些。

观察者的缺点

  • 死循环链与链堵塞。

    需要注意的是,被观察者也可以成为观察者,而一旦形成一链式结构,一是很容易造成死循环,二是链过长导致维护困难,调试困难。

    而在链过长的情况下,同步顺序分发中一旦中间某个节点分发错误,就造成后面的消息堵塞发不出去。链断开。

  • 观察者的取消问题。

    观察者模式最大的缺点,观察者的取消注册问题!!

    Java的引用机制与GC机制很容易导致OOM。在观察者进被观察者中时,弱被观察者不被销毁,观察者的引用将被一直抓着不能被释放。而这种情况在被观察者设为单例的情况下更加严峻。

    所以什么时候取消注册是一件非常棘手的事情。我们都希望可以观察在最后一刻,可什么时候是最后一刻却很难确定。

这篇关于观察者的前世今生的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975262

相关文章

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

Anti-alias的前世今生

原文: http://www.cnblogs.com/gongminmin/archive/2011/05/16/2047506.html Anti-alias,简称AA,在图形学中广泛地用于提升渲染质量。经过几十年的发展,AA也从离线渲染逐步普及到了实时渲染的领域。本系列文章将总结一下在实时渲染中使用的AA方法的前世和今生。本片集中讨论硬件提供的AA方法。 图1. 一个像素内部的采样

2 观察者模式(设计模式笔记)

2 观察者模式(别名:发布-订阅) 概念 定义对象间的一种一对多的依赖关系,当一个对象状态发生变化时,所以依赖于它的对象都得到通知并被自动更新。 模式的结构与使用 角色 主题(Subject)观察者(Observer)具体主题(ConcreteSubject)具体观察者(ConcreteObserver) 结构 Subject依赖于Observer最重要!!! package

观察者模式C++

当对象间存在一对多的关系,当状态改变时,其他对象都得到通知,这就是观察者模式了。 观察者模式实现发布-订阅功能。如我们有个项目叫NGI,需要召开StanUp会议,会议上需求变更时需要通过所有参加会议的人员,我们就可以使用观察者模式,其UML图如下: 其代码实现如下: #include <iostream>#include <list>#include <string>using n

java设计模式(行为型模式:状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式)

6,行为型模式 6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。 类图如下: 代码如下: public interface ILift {//电梯的4个状态//

php-设计模式之观察者模式

使用观察者模式实现用户注册。注册成功后台处理发邮件,处理详情等业务。   观察者模式的原理这里就不写了。php要实现观察者模式,需要实现两个接口。具体代码如下:     //用户类 class User implements SplSubject{//观察者模式 通知状态public $status = null; // 1 注册成功 2 登录成功public $observers

设计模式 19 观察者模式

设计模式 19 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式 文章目录 设计模式 19观察者模式(Observer Pat

观察者设计模式详解

观察者设计模式详解 文章目录 观察者设计模式详解一、定义二、观察者模式的结构三、特点四、应用场景五、实现 一、定义 **观察者设计模式(Observer Pattern)**是一种行为设计模式,也叫做 “发布-订阅模式”, 它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(Subject)。当主题对象的状态发生变化时,所有依赖于它的观察者都会收到通知并自动

前端常用的几种设计模式--观察者模式、单例模式等

前端常用的几种设计模式 前端开发中有几种设计模式被广泛使用,对于开发者来说,理解和掌握这些模式能够帮助他们写出更加清晰、可维护的代码。以下是一些前端开发中常用的设计模式: 模块模式(Module Pattern): 这种模式被广泛应用在 JavaScript 中,用来创建模块,这些模块可以有私有和公有的方法和变量。这种模式有助于减少全局作用域的污染,提高代码的可维护性。 var myMod

C++设计模式——Observer观察者模式

一,观察者模式的定义 观察者模式是一种行为型设计模式,又被称为"发布-订阅"模式,它定义了对象之间的一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。 观察者模式的关注点是对象之间的通信以及被观察对象的状态。 观察者模式在现实生活中的抽象实例: 报纸订阅:报纸的内容发生变化时,订阅了该报纸的读者们都会收到通知并阅读最新的内容。 股票投资:股票的价