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 相关文章推荐
flash 得到自身url参数的代码
Nov 15 Javascript
页面只能打开一次Cooike如何实现
Dec 04 Javascript
基于jquery实现等比缩放图片
Dec 03 Javascript
jQuery使用Layer弹出层插件闪退问题
Dec 22 Javascript
jQuery中的siblings()是什么意思(推荐)
Dec 29 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
React Native之TextInput组件解析示例
Aug 22 Javascript
vue不通过路由直接获取url中参数的方法示例
Aug 24 Javascript
vue如何使用 Slot 分发内容实例详解
Sep 05 Javascript
认识jQuery的Promise的具体使用方法
Oct 10 jQuery
Canvas实现微信红包照片效果
Aug 21 Javascript
详解JavaScript之Array.reduce源码解读
Nov 01 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安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP Reflection API详解
2015/05/12 PHP
详解js异步文件加载器
2016/01/24 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
bootstrap weebox 支持ajax的模态弹出框
2017/02/23 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python sorted函数原理解析及练习
2020/02/10 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
德国拖鞋网站:German Slippers
2019/11/08 全球购物
读群众路线心得体会
2014/03/07 职场文书
给校长的建议书
2014/03/12 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
跳蚤市场口号
2014/06/13 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
画展邀请函
2015/01/31 职场文书
村官个人总结范文
2015/03/03 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
零基础学java之循环语句的使用
2022/04/10 Java/Android