JS设计模式之观察者模式实现实时改变页面中金额数的方法


Posted in Javascript onFebruary 05, 2018

本文实例讲述了JS设计模式之观察者模式实现实时改变页面中金额数的方法。分享给大家供大家参考,具体如下:

观察者设计模式概念:

有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者(每个处的主账号金额函数)对象同时监听某一个主题对象(修改子账号金额后调用的deliver的对象Publisher)。这个主题对象在状态(调用deliver方法)发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

在一个会员管理系统中,主账号给子账号充值金额的功能。

场景:主账号有10000元,如果给子账号充值增加1000元,那么主账号的金额应该相对应报减少1000元显示9000元;

页面上有多种处需要实时改变的位置,怎么办?

JS设计模式之观察者模式实现实时改变页面中金额数的方法

在上图中有三处总余额要显示;

通过子加减按钮来调整账号余额的话,这三处的总余额也需要相对改变;

第一种方式:在一个函数中加添加多个元素对象,这样可以是一个门面模式,来简化调用重复的代码;

function modifyPrice(price) {
 $("#a1").html(price);
 $("#a2").html(price);
 $("#a3").html(price);
 $("#a4").html(price);
}

第二种方式:用观察者设计模式,如果状态改变了和它相关的依赖也会随之变化;

// 订阅者
function a1( price ) {
 console.log( price );
 $("#a1").html(price);
}
// 订阅者
function a2( price ) {
 console.log( price );
 $("#a2").html(price);
}
// 订阅者
function a3( price ) {
 console.log( price );
 $("#a3").html(price);
}
// 订阅者
function a4( price ) {
 console.log( price );
 $("#a4").html(price);
}
// 发布者
function PublisherPrice() {
 this.subscribers = [];
 this.addSubscriber = function( subscriber) {
  // some 如果返回true说明this.subscriber数姐中已经有了相同的订阅者了,当遇到第一个比较值是true就返回true,如果没有遇到true最后返回一个false;
  var isExsit = this.subscribers.some(function( el ){
   return el == subscriber
  });
  if ( !isExsit ) {
   this.subscribers.push( subscriber );
  }
  return this;
 }
 this.deliver = function(
  // forEach 相当于是for循环
  this.subscribers.forEach(function( fn ) {
   fn(price);
  });
  return this;
 }
}

客户端调用

var publisherPrice = new PublisherPrice();
publisherPrice.addSubscriber(a1);
publisherPrice.addSubscriber(a2);
publisherPrice.addSubscriber(a3);
publisherPrice.addSubscriber(a4);
publisherPrice.deliver("¥200.00");

第二种有什么优点?

1、每一个订阅者都是相互独立的只和发布者有关系,与发布者是一对多的关系,也可以是一对一的关系。
2、每一个订阅者可以根据自己的需求来调用,而不影响其它订阅者
3、与第一种方式相比,第二种方式的代码可读性、可维护性强;

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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

Javascript 相关文章推荐
javascript 禁用IE工具栏,导航栏等等实现代码
Apr 01 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
Mar 30 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
May 12 Javascript
Angular通过angular-cli来搭建web前端项目的方法
Jul 27 Javascript
Vuejs实现购物车功能
Nov 05 Javascript
JavaScript函数绑定用法实例分析
Nov 14 Javascript
vue双向数据绑定知识点总结
Apr 18 Javascript
JS验证输入的是否是数字及保留几位小数问题
May 09 Javascript
webpack4之SplitChunksPlugin使用指南
Jun 12 Javascript
JavaScript实现的简单Tab点击切换功能示例
Jul 06 Javascript
详解Vue取消eslint语法限制
Aug 04 Javascript
Vue+Vant 图片上传加显示的案例
Nov 03 Javascript
JS中Map和ForEach的区别
Feb 05 #Javascript
完美解决axios跨域请求出错的问题
Feb 05 #Javascript
vue 页面加载进度条组件实例
Feb 05 #Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 #Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
Feb 05 #Javascript
vue实现图片加载完成前的loading组件方法
Feb 05 #Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 #Javascript
You might like
php中文字符截取防乱码
2008/03/28 PHP
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
Yii2框架实现数据库常用操作总结
2017/02/08 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
JavaScript 原型继承
2011/12/26 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
详细分析单线程JS执行问题
2017/11/22 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
计算机应用与科学个人的自我评价
2013/11/15 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
服务明星事迹材料
2014/12/29 职场文书
五一劳动节活动总结
2015/02/09 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
工作会议通知
2015/04/15 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang