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 相关文章推荐
JavaScript 私有成员分析
Jan 13 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
transport.js和jquery冲突问题的解决方法
Feb 10 Javascript
JavaScript实现动画打开半透明提示层的方法
Apr 21 Javascript
js实现键盘Enter键提交表单的方法
May 27 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
全面了解JavaScript的数据类型转换
Jul 01 Javascript
Angular.js之作用域scope'@','=','&'实例详解
Feb 28 Javascript
React中使用collections时key的重要性详解
Aug 07 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
el-select数据过多懒加载的解决(loadmore)
May 29 Javascript
微信小程序抽奖组件的使用步骤
Jan 11 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
长波知识介绍
2021/03/01 无线电
PHP 魔术函数使用说明
2010/05/14 PHP
php操作mongoDB实例分析
2014/12/29 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
Dom与浏览器兼容性说明
2010/10/25 Javascript
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
Vue slot用法(小结)
2018/10/22 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
python中文乱码的解决方法
2013/11/04 Python
python实现基本进制转换的方法
2015/07/11 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
函授教育个人学习的自我评价
2013/12/31 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
公司节能减排倡议书
2014/05/14 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
2014年党小组工作总结
2014/12/20 职场文书
小王子读书笔记
2015/06/29 职场文书