观察者模式 发布-订阅模式(设计模式与开发实践 P8)

news/2024/11/29 21:19:52/

文章目录

    • 观察者模式
    • 运用
    • 实现

观察者模式

定义:他用来定义对象之间一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖他的对象都会得到通知

运用

如果我们使用过 DOM 上的事件函数,那就接触过观察者模式

document.body.addEventListener("click",function () {console.log("body clicked");},false
);document.body.click(); // 输出:body clicked

这段代码中 body 上添加了一个订阅者,而 document.body.click() 向所有订阅者发送了点击事件~

我们可以随意添加 订阅者 而不会影响 发布者 代码的编写

实现

接下来尝试实现一些自定义事件,通过 listen 监听某个名为 key 的事件,通过 trigger 执行事件回调函数

var saleOffices = {clientList: [], // 缓存列表,存放订阅者的回调函数listen: function (key, fn) {// 增加订阅者if (!this.clientList[key]) {// 如果还没有订阅过此类消息,给该类消息创建一个缓存列表this.clientList[key] = []; // 直接把函数推入数组}this.clientList[key].push(fn); // 订阅的消息添加进缓存列表},trigger: function () {// 发布消息var key = Array.prototype.shift.call(arguments); // 取出消息类型var fns = this.clientList[key]; // 取出该消息对应的回调函数集合if (!fns || fns.length === 0) {// 如果没有订阅该消息,则返回return false;}for (var i = 0, fn; (fn = fns[i++]); ) {// 依次执行订阅的回调函数fn.apply(this, arguments); // arguments 是发布消息时带上的参数}},
};// ----- 测试 -----
saleOffices.listen("squareMeter88", function (price) {// 小明订阅消息console.log("小明得到价格= " + price);
});saleOffices.listen("squareMeter100", function (price) {// 小红订阅消息console.log("小红价格= " + price);
});saleOffices.trigger("squareMeter88", 2000000); // 输出:2000000

http://www.ppmy.cn/news/1112896.html

相关文章

JavaWeb 学习笔记 1:MyBatis

JavaWeb 学习笔记 1:MyBatis 以往都是在 Spring Boot 中整合 MyBatis 进行使用,本篇文章将展示如何在一个新的 Maven 项目中使用 MyBatis。 MyBatis 官方的入门教程可以作为本文的参考。 1.快速入门 1.1.导入表数据 执行包含测试数据的SQL文件&#x…

leetcode 周赛——2848. 与车相交的点

题目所属分类 差分数组知识点 原题链接 给你一个下标从 0 开始的二维整数数组 nums 表示汽车停放在数轴上的坐标。对于任意下标 i,nums[i] [starti, endi] ,其中 starti 是第 i 辆车的起点,endi 是第 i 辆车的终点。 返回数轴上被车 任意…

PYTHON-模拟练习题目集合

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

周易算卦流程c++实现

代码 #include<iostream> using namespace std; #include<vector> #include<cstdlib> #include<ctime> #include<Windows.h>int huaYiXiangLiang(int all, int& left) {Sleep(3000);srand(time(0));left rand() % all 1;while (true) {if…

企业架构LNMP学习笔记53

PHP扩展安装&#xff1a; server01和server03上安装redis扩展&#xff1a; 解压编译安装&#xff1a; shell > tar xvf redis-4.3.0.tgz shell > cd redis-4.3.0 shell > phpize shell > ./configure && make && make install 配置文件php.ini&…

Python 魔法方法

视频版教程 Python3零基础7天入门实战视频教程 Python的魔法方法&#xff0c;也称为特殊方法或双下划线方法&#xff0c;是一种特殊的方法&#xff0c;用于在类中实现一些特殊的功能。这些方法的名称始终以双下划线开头和结尾&#xff0c;例如__init__&#xff0c;repr&#x…

VTK 基础入门 ( 一 ) 相机设置

/** 相机 SetClippingRange()/SetFocalPoint() / SetPosition()分别用于设置相机的前后裁剪平面、焦点和位置。 ComputeViewPlaneNormal()方法是根据设置的相机位置、焦点等信息&#xff0c;重新计算视平面 (View Plane)的法向量。 一般该法向量与视平面是垂直…

一个FlutterCocoapods项目打包问题集锦

一个Flutter&Cocoapods项目打包问题集锦 问题1 github加速问题 cocoapods项目需要访问https://github.com/CocoaPods/Specs.git&#xff0c;众所周知&#xff0c;github经常被墙&#xff0c;导致经常需要借助加速来下载和访问&#xff0c;这里可以使用油猴脚本或者Fastgi…