观察者模式的一个例子
观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者
<!DOCTYPE html> <html> <head><title></title><meta charset="utf-8"/> </head> <body> <button id="sendWeekly">发送周报</button> <button id="sendDaily">发送日报</button> <script>var inherits = function (ctor, superCtor) {// 显式的指定父类 ctor.super_ = superCtor;superCtor = typeof superCtor === "function" ? superCtor.prototype : superCtor;// ECMAScript 5 原型式继承并解除引用if (Object.create) {ctor.prototype = Object.create(superCtor, {constructor:{value:ctor,enumerable:false,writable:true,configurable:true}});} else {// 无Object.create方法的平稳退化function F() {};F.prototype = superCtor;ctor.prototype = new F();ctor.prototype.constructor = ctor;}};var Observer = (function (W) {var pubsub = function () {this.topics = {};this.subUid = -1;};// 发布方法 pubsub.prototype.fire = function (type) {var args = [].slice.call(arguments, 1),that = this;if (!this.topics[type]) {return false;}(function () {var subscribers = that.topics[type],len = subscribers ? subscribers.length : 0;while (len--) {subscribers[len].func.apply(that, args);}})();return true;};//订阅方法 pubsub.prototype.on = function (type, fn) {if (!this.topics[type]) {this.topics[type] = [];}var token = (++this.subUid).toString();this.topics[type].push({token:token,func:fn});return token;};//退订方法 pubsub.prototype.off = function (type, token) {var evT;if (type === void 0) {return this.topics = {}}if (arguments.length == 1) {if (!this.topics[type]) {return;}return delete this.topics[type];}evT = this.topics[type];for (var i = 0, j = evT.length; i < j; i++) {if (evT[i].token === token) {evT.splice(i, 1);return token;}}return false;};return pubsub;}(window));function Paper(name, pages, price) {this.name = name;this.pages = pages;this.price = price;}inherits(Paper, new Observer);Paper.prototype.send = function (topic) {this.fire(topic, {name:this.name,pages:this.pages,price:this.price});};function Person(name) {var that = this;this.name = name;this.recive = function (paper) {console.log(that.name + ' recive Pager detail:\n' + 'name:' + paper.name + '\npages:' + paper.pages + '\nprice:' + paper.price)}}var person = new Person('Lucy'),person1 = new Person('Tom');var Weekly = new Paper('weekly', 298, '$6'),Daily = new Paper('daily', 7, '$0.8');var pr = Weekly.on('weekly', person.recive),pr1 = Weekly.on('weekly', person1.recive);var pr2 = Daily.on('daily', person.recive);var $ = function (id) {return document.getElementById(id);}$('sendWeekly').onclick = function () {Weekly.send('weekly');}$('sendDaily').onclick = function () {Daily.send('daily');} </script> </body> </html>
转载于:https://www.cnblogs.com/pigtail/archive/2013/04/02/2995592.html
观察者模式的一个例子相关推荐
- [asp.net core]SignalR一个例子
摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...
- R语言使用lm构建线性回归模型、并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型预测中系统误差的一个例子 、自定义函数计算R方指标和均方根误差RMSE
R语言使用lm构建线性回归模型.并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图.可视化模型的残差.模型预测中系统误差的一个例子 .自定义函数计算R方指标和均方根误差RMSE 目 ...
- python中self_一个例子带你入门Python装饰器
============ 欢迎关注我的公众号:早起python ============ 前言 在还未正式发布的python3.9中,有一个新功能值得关注,那就是任意表达式可以作为装饰器,如果你还不知 ...
- ftp服务器文件备份,数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子...
数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子 以备份oracle数据为例 本机IP:192.168.0.1 远程IP:192.168.0.111 备份脚本 ora_bak ...
- Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子
Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子 一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...
- 用一个例子告诉你gdb调试工具如何使用
用GDB调试程序 GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式 ...
- C++中const——由一个例子想到的
前天同学实现了<C++ Primer>中关于虚函数的一个例子,拿过来问我,代码如下: #include<iostream> #include<string> usi ...
- UA PHYS515A 电磁理论II 静电学问题的一个例子
UA PHYS515A 电磁理论II 静电学问题的一个例子 例 假设有一个中空球形导体,中空部分也是一个球形,半径为aaa,球心与导体相同,导体半径为bbb:球心处有一个+q+q+q的点电荷,距离圆心 ...
- UA MATH566 一个例子:什么是隐状态
UA MATH566 一个例子:什么是隐状态 对试验结果的分析 对隐状态的分析 假设一个包里有三个色子,分别是色子A.色子B和色子C,每个色子的六个面上都标有1-4中的某个数字,其中色子A有两面标1. ...
最新文章
- MySQL------MySQL与SQLServer数据类型的转换
- android test.apk,app-debug.apk和app-debug-androidTest.apk在安装macaca-android模块的时候build失败...
- 基于MATLAB的LDPC编译码仿真,调制为64QAM
- 隐马尔科夫模型(Hidden Markov Models) 系列之五
- iframe 的一点经历
- android gps 锁屏更新坐标_MIUI内测版更新日志解析,以及动画解说!
- Spring @Autowired 注释
- Week2 Teamework from Z.XML 软件分析与用户需求调查(三)必应助手体验评测
- MYSQL 5.7.26 二进制版本安装
- qt mingw连接mysql_win下Qt连接MySql (mingw)
- jooq spring mysql_【中级篇】详细讲解使用SpringBoot + Jooq整合(一)
- 如何正确安装 Google Picasa 2 中文版?
- MySql数据库快速入门与常用sql语句
- oracle同义词6,oracle 同义词,oracle同义词是什么意思?
- SQL SERVER 2008 R2 故障转移群集实验总结
- cordova 创建app项目,签名打包部署
- WebDAV之葫芦儿·派盘+纯纯写作
- mcs51单片机嵌入式c语言习题,MCS-51单片机复习题参考题库.doc
- 计算机的硬件系统和软件系统的关系
- 为什么有些人上午容易犯困?