javascript中的观察者模式实现

观察者模式:实现JavaScript中的观察者模式 在这种模式中,一个被称为主题(Subject)的对象维护了一组观察者(Observers),并在自身状态发生变化时通知观察者。这样一来,主题对象可以灵活地添加、删除观察者,而观察者对象也可以独立于主题对象进行修改和扩展。除了上述示例中的简单观察者模式,还有其他变体的观察者模式,如使用事件驱动的观察者模式、使用Promise的观察者模式等。通过合理地运用观察者模式,我们可以更好地组织和管理对象之间的关系,提高代码的可维护性和扩展性。运行以上代码,我们会看到观察者对象收到了主题对象的通知,并执行了相应的操作。 阅读详情
比如有这样一个场景,一款游戏玩家在等级1~10之间可以领取3000点经验,等级11级以上可以领取2000点经验.


我们可以用观察者模式来实现这个需求.


这里玩家就是一个观察者,或者说是一个订阅者,游戏系统就是一个被观察者,或者说一个发送者


下面用代码来实现:

<script type="text/javascript">
// 经验系统
var Experience = function(param) {
    this.name = param.name;
    // 经验值
    this.expVal = param.expVal;
    this.players = [];
}
// 发放经验
Experience.prototype.giveExp = function(player) {
    console.log("系统送给[" + player.name + "]" + this.expVal + "点经验.");
}

// 玩家
var Player = function(param) {
    this.name = param.name;    
}

// 申请经验模式
Player.prototype.apply = function(experience) {
    var players = experience.players;
    var isExist = false;
    for(var i=0,len=players.length;i<len;i++) {
        if(players[i] == this) {
            isExist = true;
            break;
        }
    }

    if(!isExist) {
        players.push(this);
    }

    return this;
}
// 领取经验
Player.prototype.getExp = function(experience) {
    var players = experience.players;
    for(var i=0,len=players.length;i<len;i++) {
        if(players[i] == this) {
            experience.giveExp(this);
            break;
        }
    }

    return this;
}



// 测试

// 申明玩家
var player1 = new Player({"name":"张三"}); // 玩家1,等级4
var player2 = new Player({"name":"李四"}); // 玩家2,等级12

// 申明经验系统
var exp2000 = new Experience({name:"2000点经验",expVal:2000});
var exp3000 = new Experience({name:"3000点经验",expVal:3000});

// 等级1~10能申请3000点经验
player1.apply(exp3000);
// 等级11以上能申请2000点经验
player2.apply(exp2000);

// 去NPC处领取经验:
player1.getExp(exp3000);
player2.getExp(exp2000);

/*
输出:
系统送给[张三]3000点经验.
系统送给[李四]2000点经验.
*/
</script>
url=http://topic.youkuaiyun.com/u/20120601/17/ee8ee2c3-8ccd-499a-9cda-35b0e8446e47.html?seed=1266795420&r=78744239#r_78744239


基于Simulink的锂电池热模型与温控管理仿真 本文完成了基于Simulink的锂电池热模型与温控管理仿真,实现了:✅ 建立电-热耦合产热模型✅ 构建集总参数热网络✅ 设计基于迟滞的风扇启停控制✅ 验证在高倍率工况下的有效温控能力✅ 为实际电池热管理系统(BTMS)提供设计原型。 阅读详情

相关推荐

PWM调光原理详解:为什么你的LED灯会闪烁?从硬件到软件的避坑指南

本文深入解析PWM调光原理,揭示LED灯闪烁的根本原因,并提供从硬件设计到软件算法的全面解决方案。通过分析人眼视觉暂留机制和PWM参数设置,帮助开发者避免频闪问题,提升照明质量。特别适合电子工程师和智能家居开发者参考。

weixin_29189363的博客 292

js简单实现观察者模式

1、什么是观察者模式? 观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 2、代码具体实现 首先定义一个主题,用于接收状态变化,并通知每个观察者 // 主题,接收状态变化,并通知每个观察者 class Sub{ constructor(){ this.state = 0

qq_42357338的博客 5405

手把手教你用三菱PLC控制JET伺服原点:从硬件接线到GXWORKS3程序调试

本文详细介绍了如何使用三菱PLC控制JET伺服系统实现原点回归功能,涵盖硬件接线、参数配置到GX Works3程序调试的全流程。通过实战指南,帮助工程师快速掌握伺服控制技术,提升工业自动化项目的实施效率。

weixin_30642561的博客 534

JS中简单实现观察者模式

当然,JS中可没有真正意义上的接口这个东西,所以下面属于接口解耦的那一部分图解可以在这里忽略不计。

weixin_48358407的博客 879

AXI4-Stream FIFO IP核实战指南——从配置到跨时钟域处理

本文是AXI4-Stream FIFO IP核的实战指南,详细讲解了其作为数据流缓冲核心的作用。文章重点涵盖从Vivado环境下的IP核配置、关键参数(如深度与宽度)设定,到跨时钟域处理的完整流程。深入解析了TVALID/TREADY握手协议及TLAST等信号,并提供了常见问题排查与调试技巧,帮助开发者高效实现FPGA/SoC系统中可靠的数据流缓冲与同步。

weixin_29251567的博客 480

开启虚拟人物互动新时代:探索相芯Avatar SDK驱动功能(Android)

相芯SDK提供了男孩和女孩Avatar驱动模型,这些模型具备半身驱动和全身驱动的功能,使得虚拟角色能够根据用户的面部表情和动作实时模仿和响应。半身驱动功能: 相芯SDK的男孩和女孩Avatar驱动模型具备上身驱动功能,即能够通过用户的面部表情和动作来驱动虚拟角色的上半身行为。这意味着用户的面部表情、头部转动和上半身姿态等动作可以直接映射到虚拟角色上,使得虚拟角色能够栩栩如生地模仿用户的动作。例如,用户微笑时,虚拟角色会展现出笑容;用户转动头部时,虚拟角色也会相应地转动头部。

Faceunity2023的博客 631

使用JS实现一个简单的观察者模式(Observer)

使用JS实现一个简单的观察者模式(Observer)

商务合作欢迎私信我 1万+

JavaFX 概述

要从 JavaFX 中充分受益,了解 JavaFX 的设计方式以及对 JavaFX 包含的功能有一个很好的概述是很有用的。本文的目的是为您提供 JavaFX 概述。本文将首先介绍一般的 JavaFX 设计,然后介绍 JavaFX 中的各种特性。如果您熟悉 Flash/Flex,您会发现 JavaFX 在某种程度上受到了 Flash/Flex 的启发。JavaFX 中也有一些相同的想法。一般来说,JavaFX 应用程序包含一个或多个对应于窗口的阶段。每个阶段都有一个场景。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 407

JavaScript 观察者设计模式

观察者模式:观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行。而js中最常见的观察者模式就是事件触发机制。

小牛itbull的博客 983

PCL 4PCS算法实现点云粗配准【2026最新版】

博客长期更新,本文最新更新时间为:2026年5月11日。

点云侠的博客 30万+

UFS总体介绍及FPGA开发

通过实现UFS的主控制器、设备控制器等组件,我们可以在FPGA上进行UFS开发,并实现高速数据传输和低功耗特性的存储解决方案。物理层负责传输物理信号,数据链路层提供数据包的传输和错误检测功能,传输层处理数据包的分段、重组和重传,逻辑层管理设备和主控制器之间的命令和数据传输,文件系统层负责文件管理和数据存储。在本文中,我们将介绍UFS的总体架构和特性,并探讨如何在FPGA上进行UFS开发。这些组件的实现涉及到UFS协议的具体细节和硬件平台的特性,因此需要参考UFS协议规范和FPGA开发平台的相关文档。

PodProgram的博客 2135

JavaScript中的观察者模式

主要总结了观察者模式的核心概念、实现方式、应用场景及注意事项等内容。

热爱前端的大宝同学。 1480

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

如何使用Proxy实现JavaScript中的观察者模式

在软件开发中,尤其是JavaScript中,观察者模式是一种行为设计模式,它定义了一种一对多的关系。它允许多个观察者对象监听一个主题对象,并在主题状态发生变化时自动得到通知。这种模式常用于事件系统、数据绑定等场景。在JavaScript中,我们可以利用Proxy对象来实现观察者模式。Proxy对象允许我们拦截和自定义对目标对象的操作,如属性访问、赋值、枚举和函数调用。本文将逐步讲解如何使用Prox...

前端达人 1068

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

php调用ruby,ruby、javascript、php中的观察者模式实现代码

面试被问及到js中的观察者模式,这玩意儿早就了解过,可以说是动态语言中非常有用的一个设计模式,非常惭愧的没有系统的研究过。不过没关系,哪里不会补哪里,立刻动手,用所会的语言都实现一遍。观察者模式关于观察者模式,《松本行弘的程序世界》讲的非常清楚:观察者模式是当某个对象状态发生变化时,依存于该状态的全部对象自动得到通知,被观察者和观察者们是一对多的关系。书中还举了一个非常易懂的例子:获取系统当前时间...

weixin_33404438的博客 150

[设计模式] javascript 观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 或者叫做发布订阅模式 举一个例子,一家印刷厂每天印刷新报纸后送给每个订阅的顾客,印刷厂就相当于发布者,顾客就相当于订阅者 实现javascript发布订阅模式 首先是发布者应该拥有什么样的功能呢? 1,订阅者登记信息,比如印刷厂应该登记顾客订阅哪家报纸?应该送到什么地址? 2,订阅的方法 3,退订的方法 4,分发的方法...

weixin_36089438的博客 211

js中使用Proxy实现观察者模式,以及观察者模式在实战中的应用

观察者模式 又被称作发布-订阅者模式或消息机制,定义了一种依赖关系,解决注意对象和观察者之间的功能耦合。 取自 张容铭版 js设计模式 观察者模式 还是要明白两个核心点 观察目标 和 观察者 这两个 举个例子吧 var obj = { name: 'zyc', csdn: 'yunchong_zhao的博客'}; 这个obj是要被观察的对象 如果这个对象属性被赋值 或者 获取属性值得时候 就要打印出来一句话 那么打印出来的这句话 就可以看成是观察者(观察目标对象的变化) es6新增...

业余前端的职业经历 686

js设计模式之 观察者模式与应用场景

1.介绍 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 简而言之,就两个点: 一对多 发布&订阅 举个例子 ,我们平时接触的dom事件. 也是js和dom之间实现的一种观察者模式. 只要订阅了div的click事件. 当点击div的时候, function click就会...

weixin_43964148的博客 1046

从观察者模式到手写EventEmitter源码

观察者模式 观察者模式(observer)广泛的应用于javascript语言中,浏览器事件(如鼠标单击click,键盘事件keyDown)都是该模式的例子。设计这种模式背后的主要原因是促进形成低耦合...

qq_37555524的博客 256

php 观察者模式的作用,分析javascript观察者模式的原理、功能

这篇文章主要介绍了JavaScript观察者模式(publish/subscribe)原理与实现方法,简单分析了javascript观察者模式的原理、功能并结合实例形式给出了观察者模式的实现技巧,需要的朋友可以参考下本文实例讲述了Javascript观察者模式(publish/subscribe)原理与实现方法。分享给大家供大家参考,具体如下:观察者模式又叫做发布订阅模式,它定义了一种一对多的关系...

weixin_42210284的博客 119

js利用ES6中的Proxy实现观察者模式

ES6语法中新增了一个Proxy类,名字的意思为代理,在实际使用中,通常用于监听对某个对象的操作,例如:获取属性值,设置属性值、对属性值进行修改等等。这个类相当用来管理对象的操作,里面定义的方法,可以对应上对象的操作,当操作Proxy实例对象时,可以重新定义操作的逻辑,当然,如果自己不重新定义就是默认的。在对象的操作方法里面,建议使用ES6新增的Reflect,而Reflect里定义了对象操作的方...

李大人的博客 1407

js中的观察者模式 和发布订阅模式

js中的观察者模式 和发布订阅模式 ​ 前言:作为一个职场小白,这个面试题是有机会问到的,我也没有去了解过这个方面,我知道有这个东西的时候是,问新同事的面试题什么才知道有这个东西!其实我们使用vue,里面也有发布订阅模式,下面我使用了nodejs的例子阐述下,这两种模式 观察者模式: //在观察者模式中,只有两个角色 目标<-->观察者 者两个 //举例代码 // 被观察者 小宝宝 心情好和不好 //function Subject(name){this.name = name thi

weixin_50462008的博客 528

运用js中的单例模式、观察者模式实现弹幕功能

这是一个数据类型很复杂很复杂很复杂的对象, 现在我们要对它进行深复制 var d = Symbol(); var e = Symbol(); var ss={a:1}; var obj = { a: 1, b: 2, c: [1, 2, 3], zz:new Set([1,2,ss]), yy:new Map(), [d]: "aaa", z: document.createElement("div"), d: {

nqq0921的博客 288

设计模式(6):观察者模式

关于观察者模式应该是在js中使用最为广泛的一种设计模式了,这里将从以下几个方面记录观察者模式: 观察者模式的定义 观察者模式的常见的使用场景 观察者模式的简单实现 观察者模式的设计原则分析 何为观察者模式: 观察者模式是一种行为模式,比较正式一点的定义是:当一个对象的状态发生变化时,能够通知其他关联的对象进行状态的刷新。举一个生活中的例子:当我们去饭店吃饭时,点好饭菜之后就可以坐在一旁等待,...

qq_44746132的博客 241

设计模式在JavaScript中的应用:介绍一些常见的设计模式如观察者模式,工厂模式,策略模式等,并展示如何在JavaScript中实现

设计模式在JavaScript中的应用:介绍一些常见的设计模式如观察者模式,工厂模式,策略模式等,并展示如何在JavaScript中实现、单例模式、代理模式、装饰器模式

哎 你看的博客 710

js的设计模式 - 【观察者模式】

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。一对多的关系。

一个小白的成长历程 1488
上一篇: javascript脚本的性能优化
下一篇: 腾讯WEB前端面试题
jiestyle21
博客等级 码龄17年 36粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值