中介者对象可以让各个对象之间不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。

打个比方,军火买卖双方为了安全起见,找了一个信任的中介来进行交易。买家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对多关系.

一段简单的示例代码:

[目录]

原创文章转载请注明:

转载自AlloyTeam:http://www.alloyteam.com/2012/10/javascript-design-pattern-intermediary-model/

  1. laoya 2012 年 11 月 21 日

    backbone貌似是分成model collection和view,其中collection是model的集合,并不起controler的中介作用,model和view的关系是直接从view的model参数指定的,不过个人认为backbone的模式是不错的,强求严格意义的mvc并没多大好处,可能反而适得其反,没有最好,只有更合适。

  2. Stacy 2012 年 10 月 29 日

    高手!

  3. 【Javascript设计模式5】-代理模式 | Tencent AlloyTeam 2012 年 10 月 25 日

    […] 中介者模式 […]

  4. 【Javascript设计模式15】-职责链模式 | Tencent AlloyTeam 2012 年 10 月 25 日

    […] 中介者模式 […]

  5. 【Javascript设计模式16】- 享元模式 | Tencent AlloyTeam 2012 年 10 月 25 日

    […] 中介者模式 […]

发表评论