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 相关文章推荐
URI、URL和URN之间的区别与联系
Dec 20 Javascript
flash javascript之间的通讯方法小结
Dec 20 Javascript
JavaScript 字符串连接性能优化
Dec 20 Javascript
javascript中substr,substring,slice.splice的区别说明
Nov 25 Javascript
获取内联和链接中的样式(js代码)
Apr 11 Javascript
jquery实现的横向二级导航效果代码
Aug 26 Javascript
Web技术实现移动监测的介绍
Sep 18 Javascript
Bootstrap Table 搜索框和查询功能
Nov 30 Javascript
微信小程序实现折叠与展开文章功能
Jun 12 Javascript
Node.js + express基本用法教程
Mar 14 Javascript
React倒计时功能实现代码——解耦通用
Sep 18 Javascript
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
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类
2006/07/15 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP Stream_*系列函数
2010/08/01 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
php DES加密算法实例分析
2019/09/18 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
Python自带的IDE在哪里
2020/07/01 Python
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
关键字final的用法
2013/10/02 面试题
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
学校运动会通讯稿
2015/07/18 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
导游词之唐山景点
2019/12/18 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
七个非常实用的Python工具包总结
2021/06/15 Python
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫