学习JavaScript设计模式之中介者模式

一、定义

面向对象设计鼓励将行为分布到各个对象中,把对象划分成更小的粒度,有助于增强对象的可复用性。但由于这些细粒度对象之间的联系激增,又可能反过来降低它们的可复用性。 中介者模式的作用就是解除对象与对象之间的紧耦合关系。

二、示例:购买商品

  • 假设我们正在开发一个购买手机的页面,购买流程中,可以选择手机颜色以及输入购买数量,同时页面中可以对应展示输入内容。还有一个按钮动态显示下一步操作(该颜色库存量充足,显示下一步;否则显示库存不足)。
rush:xhtml;">
请选择颜色
请输入购买数量
您选择的颜色为:

您选择的数量为:

<button id="nextBtn">加入购物车

<div class="jb51code">
<pre class="brush:js;">
// 库存量
var goods = {
roseGold: 10,luxuryGold: 10
};

var colorSelect = document.getElementById("selColor"),numberInput = document.getElementById("selNum"),colorInfo = document.getElementById("conColor"),numberInfo = document.getElementById("conNum"),nextBtn = document.getElementById("nextBtn");

colorSelect.onchange = function() {
var color = colorSelect.value,// 颜色
number = +numberInput.value,// 数量
stock = goods[color]; // 对应颜色的库存量

colorInfo.innerHTML = color;
if(!color) {
nextBtn.disabled = true;
nextBtn.innerHTML = "请选择手机颜色";
return;
}

if(!number || (((number - 0) | 0) !== (number - 0))) {
nextBtn.disabled = true;
nextBtn.innerHTML = "请选择手机数量";
return;
}

if( number > stock) {
nextBtn.disabled = true;
nextBtn.innerHTML = "库存不足";
return;
}

nextBtn.disabled = false;
nextBtn.innerHTML = "加入购物车";

};

/ 购买数量做同样处理 /

页面中新增加另外一个下拉列表框,代表手机内存,上述代码改动面很大。

三、引入中介模式

所有的节点对象只跟中介者通信。 当下拉选择框selColor、selMemory亦或文本框selNum发生了事件行为时,仅通知中介者它们被改变了,同时把自己当做参数传入中介者,以便中介者辨别是谁发生了改变,剩下的事情交给中介者对象来完成。

<div class="jb51code">
<pre class="brush:xhtml;">

请选择颜色:
请选择内存:
请输入购买数量
您选择的颜色为:

您选择的内存为:

您选择的数量为:

<button id="nextBtn">加入购物车

var colorSelect = document.getElementById("selColor"),memorySelect = document.getElementById("selMemory"),memeryInfo = document.getElementById("conMemory"),nextBtn = document.getElementById("nextBtn");

var mediator = (function() {
return {
changed: function(obj) {
var color = colorSelect.value,// 颜色
memory = memorySelect.value,// 内存
number = +numberInput.value,// 数量
stock = goods[color + '|' + memory]; // 对应颜色的库存量

  if(obj === colorSelect) {
    colorInfo.innerHTML = color;
  }else if(obj === memorySelect) {
    memeryInfo.innerHTML = memory;
  }else if(obj === numberInput) {
    numberInfo.innerHTML = number;
  }

  if(!color) {
    nextBtn.disabled = true;
    nextBtn.innerHTML = "请选择手机颜色";
    return;
  }

  if(!memory) {
    nextBtn.disabled = true;
    nextBtn.innerHTML = "请选择手机内存";
    return;
  }

  if(!number || (((number - 0) | 0) !== (number - 0))) {
    nextBtn.disabled = true;
    nextBtn.innerHTML = "请选择手机数量";
    return;
  }

  if( number > stock) {
    nextBtn.<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>abled = true;
    nextBtn.innerHTML = "库存不足";
    return;
  }

  nextBtn.<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>abled = false;
  nextBtn.innerHTML = "加入购物车";
}

};
})();

// 事件函数
colorSelect.onchange = function() {
mediator.changed(this);
};
memorySelect.onchange = function() {
mediator.changed(this);
};
numberInput.oninput = function() {
mediator.changed(this);
}

中介者模式是迎合迪米特法则的一种实现。迪米特法则也叫最少知识原则,是指一个对象应该尽可能少地了解另外的对象。避免“城门失火,殃及鱼池”。

缺点:最大的缺点是系统中会增加一个中介对象,因为对象之间交互的复杂性,转移成了中介对象的复杂性,使得中介者对象经常是巨大的,很难维护。

一般来说,如果对象之间的复杂耦合确实导致调用和维护出现了困难,而且这些耦合度随项目的变化呈指数增长,那么我们可以考虑用中介者模式来重构代码

希望本文所述对大家学习javascript程序设计有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)