观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者

模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
下面,我是在他人基础上做的一个封装以及简单继承。
<!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

观察者模式的一个例子相关推荐

  1. [asp.net core]SignalR一个例子

    摘要 在一个后台管理的页面想实时监控一些操作的数据,想到用signalR. 一个例子 asp.net core+signalR 使用Nuget安装包:Microsoft.AspNetCore.Sign ...

  2. R语言使用lm构建线性回归模型、并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型预测中系统误差的一个例子 、自定义函数计算R方指标和均方根误差RMSE

    R语言使用lm构建线性回归模型.并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图.可视化模型的残差.模型预测中系统误差的一个例子 .自定义函数计算R方指标和均方根误差RMSE 目 ...

  3. python中self_一个例子带你入门Python装饰器

    ============ 欢迎关注我的公众号:早起python ============ 前言 在还未正式发布的python3.9中,有一个新功能值得关注,那就是任意表达式可以作为装饰器,如果你还不知 ...

  4. ftp服务器文件备份,数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子...

    数据备份是十分重要的,下面是通过ftp将本机数据备份到远程服务器的一个例子 以备份oracle数据为例 本机IP:192.168.0.1 远程IP:192.168.0.111 备份脚本 ora_bak ...

  5. Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子

    Bootice1.34版本把grub4dos0.46a写入硬盘MBR失败一个例子         一个同事的台式机,BIOS启动,500GB硬盘,分了四个MBR分区,C盘是激活的主分区,第二个分区50 ...

  6. 用一个例子告诉你gdb调试工具如何使用

                                        用GDB调试程序 GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式 ...

  7. C++中const——由一个例子想到的

    前天同学实现了<C++ Primer>中关于虚函数的一个例子,拿过来问我,代码如下: #include<iostream> #include<string> usi ...

  8. UA PHYS515A 电磁理论II 静电学问题的一个例子

    UA PHYS515A 电磁理论II 静电学问题的一个例子 例 假设有一个中空球形导体,中空部分也是一个球形,半径为aaa,球心与导体相同,导体半径为bbb:球心处有一个+q+q+q的点电荷,距离圆心 ...

  9. UA MATH566 一个例子:什么是隐状态

    UA MATH566 一个例子:什么是隐状态 对试验结果的分析 对隐状态的分析 假设一个包里有三个色子,分别是色子A.色子B和色子C,每个色子的六个面上都标有1-4中的某个数字,其中色子A有两面标1. ...

最新文章

  1. MySQL------MySQL与SQLServer数据类型的转换
  2. android test.apk,app-debug.apk和app-debug-androidTest.apk在安装macaca-android模块的时候build失败...
  3. 基于MATLAB的LDPC编译码仿真,调制为64QAM
  4. 隐马尔科夫模型(Hidden Markov Models) 系列之五
  5. iframe 的一点经历
  6. android gps 锁屏更新坐标_MIUI内测版更新日志解析,以及动画解说!
  7. Spring @Autowired 注释
  8. Week2 Teamework from Z.XML 软件分析与用户需求调查(三)必应助手体验评测
  9. MYSQL 5.7.26 二进制版本安装
  10. qt mingw连接mysql_win下Qt连接MySql (mingw)
  11. jooq spring mysql_【中级篇】详细讲解使用SpringBoot + Jooq整合(一)
  12. 如何正确安装 Google Picasa 2 中文版?
  13. MySql数据库快速入门与常用sql语句
  14. oracle同义词6,oracle 同义词,oracle同义词是什么意思?
  15. SQL SERVER 2008 R2 故障转移群集实验总结
  16. cordova 创建app项目,签名打包部署
  17. WebDAV之葫芦儿·派盘+纯纯写作
  18. mcs51单片机嵌入式c语言习题,MCS-51单片机复习题参考题库.doc
  19. 计算机的硬件系统和软件系统的关系
  20. 为什么有些人上午容易犯困?

热门文章

  1. 408计算机网络学习笔记——网络层
  2. 嵌入式Linux(二)汇编LED驱动实验
  3. U-BOOT启动流程详细分析[转]
  4. chrome.exe(或其他exe)- 损坏的映像
  5. 如何设置默认浏览器?快速学会,简单易懂
  6. Android如何自定义服务器DynamicMockServer的使用
  7. 【音乐】如果历史是一群喵主题曲钢琴弹奏
  8. 美信监控易:石油销售公司全省IT一体化运维解决方案
  9. 2005 最新GIS地理信息系统软件
  10. 自上而下拆解Synchronized