GoF定义:
“定义一个接口用来封装一群对象的互动行为,中介者通过移除对象之间的引用,来减少它们之间的耦合度,并且能改变它们之间的互动独立性”。
在外观模式下,已经将需要使用不同子系统功能来做出一个更强大的功能这样的事情做好了,即
一个外观类有5个子系统A,B,C,D,E, 外观类有2个方法Method1和Method2
Method1执行A,B,C的方法来进行实现功能
Method2执行C,D,E的方法来进行实现功能
此时并不代表,A,B,C,D,E子系统之间就没有产生任何耦合,假设A拥有B,C系统对象,C拥有D,E系统对象才能实现其内部的方法,如果真的仅仅靠外观模式来解耦是不行的,因为外观模式是为了处理子系统具体功能之间的联系,进行再一次的高度封装而已。
但是,外观模式里的子系统们之间可能还存在如上所述的高耦合关系,此时【中介者模式】就可以解决这个问题!
现在A拥有B,C对象,C拥有D,E对象,使用中介者之后,就是中介者类拥有A,B,C,D,E子系统,然后A如果需要和B,C进行交互,那么通过中介者即可进行交互,例如:A的方法Play()的实现 需要调用B类的Show方法和C的Hide方法,那么此时中介者就可以制作一个方法名为ShowBHideC()的方法,调用B的Show和C的Hide,A方法只需调用中介者类的ShowBHideC()方法即可!
这样的好处是完全分离类,减少了耦合,使得类是完全独立的,类一切要与外部进行交互都要通过中介者进行,将调用逻辑放在中介者,具体实现逻辑放在具体类中。
中介者避免了类中需要引用一堆外部类对象,减少犯错机会,降低耦合度。
这里说说什么是犯错机会啊,我觉得大部分新手都会犯错的,就是空指针(空引用),例如:A系统原本是拥有B和C系统对象的,假设A方法有个地方将B或C置空了,由于对象是引用类型,那么其他地方的B和C对象也会置空,导致出现错误。