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 相关文章推荐
js实现的日期操作类DateTime函数代码
Mar 16 Javascript
jQuery对象初始化的传参方式
Feb 26 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
详解AngularJS ng-class样式切换
Jun 27 Javascript
原生js封装运动框架的示例讲解
Oct 01 Javascript
javascript中的隐式调用
Feb 10 Javascript
js 计算图片内点个数的示例代码
Apr 04 Javascript
vue 解决文本框被键盘遮住的问题
Nov 06 Javascript
详解js中的几种常用设计模式
Jul 16 Javascript
vue 组件简介
Jul 31 Javascript
NestJs使用Mongoose对MongoDB操作的方法
Feb 22 Javascript
Javascript中的解构赋值语法详解
Apr 02 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
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
js渐变显示渐变消失示例代码
2013/08/01 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
详解JavaScript函数
2015/12/01 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
2016/08/18 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
在TensorFlow中实现矩阵维度扩展
2020/05/22 Python
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
const和static readonly区别
2013/05/20 面试题
酒店员工培训方案
2014/06/02 职场文书
医生个人年度总结
2015/02/28 职场文书
如何撰写创业策划书
2019/06/27 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript