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 相关文章推荐
弹出广告特效代码(一个IP只弹出一次)
May 11 Javascript
编辑浪子版表单验证类
May 12 Javascript
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
xheditor与validate插件冲突的解决方案
Apr 15 Javascript
解析js如何获取当前url中的参数值并复制给input
Jun 23 Javascript
用javascript判断IE版本号简单实用且向后兼容
Sep 11 Javascript
js函数在frame中的相互调用详解
Mar 03 Javascript
jQuery的context属性用法实例
Dec 27 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
微信小程序签到功能
Oct 31 Javascript
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
Vue详细的入门笔记
May 10 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
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
php的字符串用法小结
2010/06/08 PHP
几个实用的PHP内置函数使用指南
2014/11/27 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
一个收集图片的bookmarlet(js 刷新页面中的图片)
2010/05/27 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
详解JavaScript对象的深浅复制
2017/03/30 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python中的装饰器详解
2015/04/13 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python实现二维数组的对角线遍历
2019/03/02 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
如何使用python代码操作git代码
2020/02/29 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
HTML5 Plus 实现手机APP拍照或相册选择图片上传功能
2016/07/13 HTML / CSS
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
日本小田急百货官网:Odakyu
2018/07/19 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书