javascript设计模式 ? 观察者模式原理与用法实例分析


Posted in Javascript onApril 22, 2020

本文实例讲述了javascript设计模式 ? 观察者模式原理与用法。分享给大家供大家参考,具体如下:

介绍:前面我们针对系统内一对多,多对多的情况做了解决方案,是使用中介者模式,将所有关联关系交由中介者处理。这一节我们介绍另外一种解决一对多问题的设计模式:观察者模式
观察者模式是使用频率最高的设计模式之一,用于建立一种对象与对象之间的依赖关系。

定义:定义对象之间的之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅模式,模型-视图模式,监听模式或从属模式。观察者模式是一种对象行为型模式。

场景:我们使用观察者模式做一个进制转换的小demo

示例:

var Subject = function(){
  var obServer = [];
  var _state;
 
  this.getState = function(){
    return _state;
  }
  this.setState = function(state){
    _state = state;
    this.notifyAllObservers();
  }
  this.attach = function(ob){
    obServer.push(ob);
  }
  this.notifyAllObservers = function(){
    obServer.map(function(item){
      item.update();
    });
  }
}
 
var BinaryObserver = function(subject){
  var _subject = subject;
  _subject.attach(this);
 
  this.update = function(){
    console.log('Binary String:' + _subject.getState().toString(2));
  }
}
 
var OctalObserver = function(subject){
  var _subject = subject;
  _subject.attach(this);
 
  this.update = function(){
    console.log('Octal String:' + _subject.getState().toString(8));
  }
}
 
var HexaObserver = function(subject){
  var _subject = subject;
  _subject.attach(this);
 
  this.update = function(){
    console.log('Hex String:' + _subject.getState().toString(16));
  }
}
 
var subject = new Subject();
 
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
 
subject.setState(15);
// Hex String:f
// Octal String:17
// Binary String:1111

在这个例子里面Subject称为目标,它是被观察的对象,一个目标允许被多个观察者观察,这些观察者存放于obServer的数组中,当目标发生change时通知所有观察者。
BinaryObserver,OctalObserver,HexaObserver这三个类称为观察者,观察者将对目标的改变作出反应。在观察者中需要维护一个指向目标对象的引用。

观察者模式总结:

优点:
* 观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制。
* 观察者模式在观察目标和观察者者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无需了解其具体观察者。
* 观察者模式支持广播通信,观察目标会向所有已注册的观察者发送通知,简化了一对多系统的设计难度

缺点:
* 在存在大量观察者时,对所有观察者的通知会花大量时间
* 如果观察者和目标之间存在循环依赖,将会导致系统崩溃

适用场景:
* 系统中存在一个对象的改变将导致一个或多个其他对象也发生改变。
* 系统中存在大量依赖链,A影响B,B影响C,C影响D

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
HTTP状态代码以及定义(解释)
Feb 02 Javascript
How to Auto Include a Javascript File
Feb 02 Javascript
jquery ready()的几种实现方法小结
Jun 18 Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 Javascript
Javascript面向对象设计一 工厂模式
Dec 20 Javascript
商城常用滚动的焦点图效果代码简单实用
Mar 28 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
Bootstrap响应式侧边栏改进版
Sep 17 Javascript
jquery uploadify隐藏上传进度的实现方法
Feb 06 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
Aug 25 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
Apr 04 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
Apr 22 #Javascript
Vue computed 计算属性代码实例
Apr 22 #Javascript
js 解析 JSON 数据简单示例
Apr 21 #Javascript
react 原生实现头像滚动播放的示例
Apr 21 #Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 #Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 21 #Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
Apr 21 #Javascript
You might like
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
php去除HTML标签实例
2013/11/06 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
Javascript实现代码折叠功能
2016/08/25 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
layui table 参数设置方法
2018/08/14 Javascript
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
图文详解WinPE下安装Python
2016/05/17 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
Python Web版语音合成实例详解
2019/07/16 Python
Python collections模块使用方法详解
2019/08/28 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
python numpy 反转 reverse示例
2019/12/04 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
Python接口测试get请求过程详解
2020/02/28 Python
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
财务会计专业应届毕业生求职信
2013/10/18 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
复活读书笔记
2015/06/29 职场文书
正确使用MySQL update语句
2021/05/26 MySQL
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android
什么是SOLID
2022/03/24 Javascript