中介者对象可以让各个对象之间不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
打个比方,军火买卖双方为了安全起见,找了一个信任的中介来进行交易。买家 A 把钱交给中介 B,然后从中介手中得到军火,卖家 C 把军火卖给中介,然后从中介手中拿回钱。一场交易完毕,A 甚至不知道 C 是一只猴子还是一只猛犸。因为中介的存在,A 也未必一定要买 C 的军火,也可能是 D,E,F。
银行在存款人和贷款人之间也能看成一个中介。存款人 A 并不关心他的钱最后被谁借走。贷款人 B 也不关心他借来的钱来自谁的存款。因为有中介的存在,这场交易才变得如此方便。
中介者模式和代理模式有一点点相似。都是第三者对象来连接 2 个对象的通信。具体差别可以从下图中区别。
代理模式:
中介者模式
代理模式中 A 必然是知道 B 的一切,而中介者模式中 A,B,C 对 E,F,G 的实现并不关心. 而且中介者模式可以连接任意多种对象。
切回到程序世界里的 mvc,无论是 j2ee 中 struts 的 Action. 还是 js 中 backbone.js 和 spine.js 里的 Controler. 都起到了一个中介者的作用.
拿 backbone 举例. 一个 mode 里的数据并不确定最后被哪些 view 使用. view 需要的数据也可以来自任意一个 mode. 所有的绑定关系都是在 controler 里决定. 中介者把复杂的多对多关系, 变成了 2 个相对简单的 1 对多关系.
一段简单的示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 |
var mode1 = Mode.create(), mode2 = Mode.create(); var view1 = View.create(), view2 = View.create(); var controler1 = Controler.create( mode1, view1, function(){ view1.el.find( ''div' ).bind( ''click', function(){ this.innerHTML = mode1.find( 'data' ); } ) }) var controler2 = Controler.create( mode2 view2, function(){ view1.el.find( ''div' ).bind( ''click', function(){ this.innerHTML = mode2.find( 'data' ); } ) }) |
laoya 2012 年 11 月 21 日
backbone 貌似是分成 model collection 和 view,其中 collection 是 model 的集合,并不起 controler 的中介作用,model 和 view 的关系是直接从 view 的 model 参数指定的,不过个人认为 backbone 的模式是不错的,强求严格意义的 mvc 并没多大好处,可能反而适得其反,没有最好,只有更合适。
Stacy 2012 年 10 月 29 日
高手!
【Javascript设计模式5】-代理模式 | Tencent AlloyTeam 2012 年 10 月 25 日
[…] 中介者模式 […]
【Javascript设计模式15】-职责链模式 | Tencent AlloyTeam 2012 年 10 月 25 日
[…] 中介者模式 […]
【Javascript设计模式16】- 享元模式 | Tencent AlloyTeam 2012 年 10 月 25 日
[…] 中介者模式 […]
【Javascript设计模式2】-简单工厂模式 | Tencent AlloyTeam 2012 年 10 月 25 日
[…] 中介者模式: http://www.alloyteam.com/2012/10/javascript-design-pattern-intermediary-model/ […]
【Javascript设计模式1】-单例模式 | Tencent AlloyTeam 2012 年 10 月 24 日
[…] 中介者模式: http://www.alloyteam.com/2012/10/javascript-design-pattern-intermediary-model/ […]
【Javascript设计模式3】-观察者模式 | Tencent AlloyTeam 2012 年 10 月 24 日
[…] 中介者模式: http://www.alloyteam.com/2012/10/javascript-design-pattern-intermediary-model/ […]
【javascript设计模式17】- 状态模式 | Tencent AlloyTeam 2012 年 10 月 24 日
[…] 中介者模式: http://www.alloyteam.com/2012/10/javascript-design-pattern-intermediary-model/ […]
【javascript设计模式8】-访问者模式 | Tencent AlloyTeam 2012 年 10 月 24 日
[…] 中介者模式: http://www.alloyteam.com/2012/10/javascript-design-pattern-intermediary-model/ […]
【javascript设计模式6】-桥接模式 | Tencent AlloyTeam 2012 年 10 月 24 日
[…] 中介者模式: http://www.alloyteam.com/2012/10/javascript-design-pattern-intermediary-model/ […]