2017-01-01 中介者模式
mediator |ˈmiːdɪeɪtə(r)|、colleague |ˈkɒliːg|
Mediator Pattern
使用中介者模式(Mediator Pattern)来集中相关对象之间复杂的沟通和控制方式。
引入中介者
每个对象都会在自己的状态改变时,告诉中介者。
每个对象都会对中介者所发出的请求作出回应。
在没有中介者的情况下,所有的对象都需要认识其他对象,也就是说,对象之间是紧耦合的。有了中介者之后,对象之间彻底解耦。
中介者内包含了整个系统的控制逻辑。当某装置需要一个新的规则时,或者是一个新的装置被加入系统内,其所有需要用到的逻辑也都被加进了中介者内。
优点:
通过将对象彼此解耦,可以增加对象的复用性。
通过将控制逻辑集中,可以简化系统维护。
可以让对象之间所传递的消息变得简单而且大幅减少。
缺点:
中介者常常被用来协调相关的GUI组件。
中介者的缺点时,如果设计不当,中介者对象本身会变得过于复杂。
中介者模式又叫调解者模式
尽管将一个系统分割成许多对象通常可以增加其复用性,但是对象间相互连接的激增又会降低其可复用性。大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。如“迪米特法则”所诉:如果两个类不彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
通过中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,每个对象不再通过直接的联系与另一个对象发生相互作用,而是通过‘中介者’对象与另一个对象相互作用。中介者对象的设计,使得系统的结构不会因为新对象的引入造成大量的修改工作。
中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而是要先反思你的系统在设计上是不是合理。
Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Mediator和Colleague
由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
由于ConcreteMediator控制了集中化,于是就把交互复杂性变成了中介者的复杂性,这就使得中介者变得比任何一个ConcreteColleague都复杂。事实上中介者的优点来自于集中控制,其缺点也是它。
中介者模式一般应用于一组对象定义良好但是复杂的方式进行通信的场合。