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客户端将指定区域导出到Word、Excel的代码
Oct 22 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
May 11 Javascript
JS.elementGetStyle(element, style)应用示例
Sep 24 Javascript
jquery隐藏标签和显示标签的实例
Nov 11 Javascript
ie8下修改input的type属性报错的解决方法
Sep 16 Javascript
jquery实现键盘左右翻页特效
Apr 30 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 Javascript
AngularJS 模块详解及简单实例
Jul 28 Javascript
Vue修改mint-ui默认样式的方法
Feb 03 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
Nov 09 jQuery
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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
PHP数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
浅析php数据类型转换
2014/01/09 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
PHP类的封装与继承详解
2015/09/29 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
浅析vue数据绑定
2017/01/17 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
python字典多条件排序方法实例
2014/06/30 Python
Python 登录网站详解及实例
2017/04/11 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
python实现超市商品销售管理系统
2019/11/22 Python
解决python虚拟环境切换无效的问题
2020/04/30 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
档案接收函范文
2014/01/10 职场文书
试用期员工考核制度
2014/01/22 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
营销学习心得体会
2014/09/12 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
维稳工作承诺书
2015/01/20 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang