中介者模式是一种行为型设计模式,它的目的是通过增加一个中介对象,解除对象与对象之间的紧耦合关系.
增加中介对象后,所有的相关对象都通过中介对象来通信,而不是互相引用,所有当一个对象发生改变时,只需要通知中介者对象即可.
使用场景
中介模式可以很好的将对象之间进行解耦,如果对象之间的复杂耦合导致调用和维护出现困难,而且这些耦合随项目的变化呈指数增加,则可以考虑使用中介者模式重构代码.
缺陷
系统中新增一个中介者对象,所有对象之间交互的复杂性都转移为中介者对像的复杂度.这会使得中介者对象经常巨大,往往成为难以维护的对象.而且新增的对象会占用一部分系统资源.
如果对象之间的复杂度是可以控制的,并且不会随着对象增加而增加它们的维护难度,则没有必要使用中介者模式.
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
var goods = { "red|32G": 3, "red|16G": 0, "blue|32G": 1, "blue|16G": 6 }
var mediator = (function () { var colorSelect = document.getElementById('colorSelect'), memorySelect = document.getElementById('memorySelect'), colorInfo = document.getElementById('colorInfo'), numberInput = document.getElementById('numberInput'), memoryInfo = document.getElementById('memoryInfo'), numberInfo = document.getElementById('numberInfo'), nextBtn = document.getElementById('nextBtn'); return { changed (obj) { var color = colorSelect.value, memory = memorySelect.value, number = numberInput.value, stock = goods[color+'|'+memory]; if(obj === colorSelect) { colorInfo.innerHTML = color; } else if (obj === numberInput) { memoryInfo.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.isInteger(number - 0) && number > 0) { nextBtn.disabled = true; nextBtn.innerHTML = '请输入正确的购买数量'; return; } nextBtn.disabled = false; nextBtn.innerHTML = '放入购物车'; } } })
colorSelect.onchange = function () { mediator.change(this); }
memorySelect.onchange = function () { mediator.change(this); }
numberInput.onchange = function () { mediator.change(this); }
|