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一些不错的函数脚本代码
Sep 10 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
Feb 27 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
May 06 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
Jun 15 Javascript
jQuery实现列表的全选功能
Mar 18 Javascript
js实现可输入可选择的select下拉框
Dec 21 Javascript
Jquery根据浏览器窗口改变调整大小的方法
Feb 07 Javascript
vue-cli项目无法用本机IP访问的解决方法
Sep 20 Javascript
layui多图上传实现删除功能的例子
Sep 23 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
Oct 26 Javascript
10分钟学会js处理json的常用方法
Dec 06 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
网站当前的在线人数
2006/10/09 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
基于JQuery的日期联动实现代码
2011/02/24 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
文言文形式的学生求职信
2013/12/03 职场文书
五年级英语教学反思
2014/01/31 职场文书
作文批改评语大全
2014/04/23 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
浅谈mysql执行过程以及顺序
2021/05/12 MySQL
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫