首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >观察者模式

观察者模式

原创
作者头像
WindRunnerMax
修改于 2020-10-27 02:26:51
修改于 2020-10-27 02:26:51
4730
举报
文章被收录于专栏:Czy‘s BlogCzy‘s Blog

观察者模式

观察者模式Observer Pattern是一种对象行为型模式,当定义的对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新,观察者模式又叫做发布-订阅Publish - Subscribe模式、模型-视图Model - View模式、源-监听器Source - Listener模式或从属者Dependents模式。

描述

观察者模式建立了一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。所以发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。

优点

  • 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
  • 观察者模式在观察目标和观察者之间建立一个抽象的耦合。
  • 观察者模式支持广播通信。
  • 观察者模式符合开闭原则的要求。

缺点

  • 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

适用环境

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
  • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
  • 一个对象必须通知其他对象,而并不知道这些对象是谁。
  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

实现

代码语言:txt
AI代码解释
复制
class PubSub{ // 订阅-发布类
    constructor(){
        this.handlers = {};
    }

    on(key, handler) { // 订阅
        if (!(key in this.handlers)) this.handlers[key] = [];
        this.handlers[key].push(handler);
    }

    off(key, handler) { // 卸载
        const index = this.handlers[key].findIndex(item => item === handler);
        if (index < 0) return false;
        if (this.handlers[key].length === 1) delete this.handlers[key];
        else this.handlers[key].splice(index, 1);
        return true;
    }

    commit(key, ...args) { // 触发
        if (!this.handlers[key]) return false;
        this.handlers[key].forEach(handler => handler.apply(this, args));
        return true;
    }
}

const eventBus = new PubSub();

/**
  求职者订阅了一些招聘网站,只要有匹配的工作机会,他们就会得到通知
*/
class JobBoard{ // 招聘公告板
    subscribe(funct) {
        eventBus.on("job-sub", funct);
    }

    notify(){
        eventBus.commit("job-sub");
    }
}

class JobSeeker { // 求职者
    constructor(name) {
        this._name = name;
    }

    notify() {
        console.log(this._name, "has been notified of a new posting");
    }
}

(function(){
    var jonDoe = new JobSeeker("John Doe")
    var janeDoe = new JobSeeker("Jane Doe")
    var kaneDoe = new JobSeeker("Kane Doe")

    var jobBoard = new JobBoard();
    jobBoard.subscribe(() => jonDoe.notify());
    jobBoard.subscribe(() => janeDoe.notify());
    jobBoard.subscribe(() => kaneDoe.notify());

    jobBoard.notify();
})();

每日一题

代码语言:txt
AI代码解释
复制
https://github.com/WindrunnerMax/EveryDay

参考

代码语言:txt
AI代码解释
复制
https://www.runoob.com/design-pattern/observer-pattern.html
https://github.com/sohamkamani/javascript-design-patterns-for-humans#-observer
https://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
拒绝Go代码臃肿,其实在这几块可以用下观察者模式
今天学习一下用 Go 实现观察者模式,观察者模式主要是用来实现事件驱动编程。事件驱动编程的应用还是挺广的,除了我们都知道的能够用来解耦:用户修改密码后,给用户发短信进行风险提示之类的典型场景,在微服务架构实现最终一致性、实现事件源(A + ES)这些都会用到。
KevinYan
2022/10/27
2460
Java 中的观察者模式
----本文来源于Rohit Joshi的《Java Design Patterns》一书的Chapter7:Observer Design Pattern
码农小胖哥
2020/05/08
7800
Java 中的观察者模式
观察者模式
大家好,我是老田,今天我给大家分享设计模式中的观察者模式。用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式。
田维常
2021/07/15
7490
设计模式---观察者模式
微信公众号有服务号、订阅号和企业号之分。当我们在公众号上发布一篇博文推送时,订阅的用户都能够在我发布推送之后及时接收到推送,即可方便地在手机端进行阅读。
大忽悠爱学习
2021/11/15
2940
设计模式之观察者模式及典型应用
微信公众号有服务号、订阅号和企业号之分。以我的公众号为例,我的公众号类型是订阅号,名称是 "小旋锋",专注于大数据,Java后端类技术分享。目前主要是分享学习笔记为主,尽量做到 "原创"、"高质量"、"成体系"。每当我发布一篇博文推送,订阅的用户都能够在我发布推送之后及时接收到推送,即可方便地在手机端进行阅读。
小旋锋
2019/01/21
1.2K0
13.观察者模式设计思想
本文详细介绍了观察者模式的设计思想,包括其定义、实现方式、优缺点及应用场景。通过微信公众号的例子,阐述了如何使用观察者模式实现对象间的依赖关系,确保一个对象状态改变时能自动通知其他对象。
杨充
2024/11/13
1800
【设计模式 10】观察者模式
观察者模式又叫发布订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时会通知所有观察者对象,使它们能够自动更新自己。
JuneBao
2022/10/26
3190
【设计模式 10】观察者模式
TypeScript 设计模式之观察者模式
在软件系统中经常碰到这类需求:当一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。这是建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。
pingan8787
2020/08/17
1.3K0
javascript设计模式-观察者模式
每当事件发生时,可观察对象都会通知所有观察者!也就是一旦可观察对象发生变化,所有的观察者都会得到通知
FE情报局
2023/01/31
3140
javascript设计模式-观察者模式
Java设计模式-观察者模式
观察者模式: 又称‘发布-订阅’模式, 定义一种对象间的一对多依赖关系(多个观察者Observer监听某一主题Subject). 当主题状态发生改变时,所有依赖它的对象都得到通知并被自动更新. 核心
Java帮帮
2018/03/16
8760
Java设计模式-观察者模式
设计模式 | 行为型 | 观察者模式
观察者模式(Observer) 观察者模式(Observer) 介绍 观察者模式是一种行为型设计模式。 可以用来定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。 适用场景 当应用中的一些对象必须观察其他对象时,可使用该模式。 当一个对象状态的改变需要改变其他对象,或实际对象是事先未知的或动态变化的时,可使用该模式。 ... 优缺点 优点: 开闭原则:无须修改发布者代码即可引入新的订阅类,反之亦然。 可以在运行时建立对象之间的联系。 缺点: 通知顺序随机。 与其他模式的关系
被水淹没
2023/02/25
3180
设计模式 | 行为型 | 观察者模式
EventBus观察者模式
EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus是一个非常优雅和简单解决方案。
叔牙
2020/11/19
7200
EventBus观察者模式
设计模式学习笔记(十九)观察者模式及应用场景
观察者模式(Observer Design Pattern),也叫做发布订阅模式(Publish-Subscribe Design Pattern)、模型-视图(Model-View)模式、源-监听器(Source-Listener)模式、从属者(Dependents)模式。指在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。
归思君
2023/10/16
4620
设计模式学习笔记(十九)观察者模式及应用场景
23种设计模式之观察者模式
观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。
Java技术债务
2022/09/26
2940
23种设计模式之观察者模式
观察者模式
消息队列(MQ),一种能实现生产者到消费者单向通信的通信模型,这也是现在常用的主流中间件。
敖丙
2021/07/02
3660
Java设计模式之(十二)——观察者模式
观察者模式(Observer Design Pattern):在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会得到通知并自动更新。
IT可乐
2021/12/04
5.3K0
Java设计模式之(十二)——观察者模式
观察者模式的思考
观察者模式(Observer Pattern)是一种行为型设计模式,它的起源可以追溯到20世纪90年代初,由设计模式四人帮(Erich Gamma, Richard Helm, Ralph Johnson 和 John Vlissides)在其著作《设计模式:可复用面向对象软件的基础》中首次提出。观察者模式用于解决对象之间的一对多依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会得到通知并自动更新。
不惑
2024/07/23
4270
观察者模式的思考
Go 设计模式-观察者模式
观察者模式,也被称为发布订阅模式(Publish-Subscribe Design Pattern)
王小明_HIT
2021/07/27
4080
一起学设计模式 - 观察者模式
观察者模式是一种使用率极高的模式,用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
battcn
2018/08/03
3770
一起学设计模式 - 观察者模式
观察者模式
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
JusterZhu
2023/09/27
2020
观察者模式
相关推荐
拒绝Go代码臃肿,其实在这几块可以用下观察者模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档