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编程起步(第三课)
Feb 27 Javascript
jquery text()要注意啦
Oct 30 Javascript
jQuery学习5 jQuery事件模型
Feb 07 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
Feb 27 Javascript
JavaScript入门基础
Aug 12 Javascript
html+js+highcharts绘制圆饼图表的简单实例
Aug 04 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
Feb 14 Javascript
微信小程序 开发之全局配置
May 05 Javascript
javascript获取指定区间范围随机数的方法
Sep 08 Javascript
Angular封装搜索框组件操作示例
Apr 25 Javascript
jsonp跨域获取百度联想词的方法分析
May 13 Javascript
vue+echarts实现动态折线图的方法与注意
Sep 01 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代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
在IE8上JS实现combobox支持拼音检索功能
2016/05/23 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
python shell根据ip获取主机名代码示例
2017/11/25 Python
浅谈django的render函数的参数问题
2018/10/16 Python
np.random.seed() 的使用详解
2020/01/14 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
pyspark 随机森林的实现
2020/04/24 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
教师求职推荐信范文
2013/11/20 职场文书
高一数学教学反思
2014/02/07 职场文书
内勤主管岗位职责
2014/04/03 职场文书
比赛口号大全
2014/06/10 职场文书
聘用意向书
2014/07/29 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
店铺转让协议书
2015/01/29 职场文书
爱国电影观后感
2015/06/19 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle