面临问题:
在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。
对象之间有行为交互,但是一个对象需求有变化,还需要修改引用关系!这是怎么才处理这些复杂的引用关系,是不是有一种方法,能够处理这种不断发生变化的,不同对象的交互行为。
解决方案:
在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
虽然将一个系统分割成许多对象通常可以增强可复用性, 但是对象间相互连接的激增又会降低其可复用性。 可以通过将集体行为封装在一个单独的mediator对象中以避免这个问题。中介者负责控制和协调一组对象间的交互。中介者充当一个中介以使组中的对象不再相互显式引用。这些对象仅知道中介者, 从而减少了相互连接的数目。
为什么是行为型模式呢?因为处理对象之间不断变化的行为,而不是需要重新建立对象或者产品。这是就需要封装这些行为,提供一个统一的中介让对象进行交换。
个人理解:看起来和facade功能类似,提供一个统一的接口供用户进行访问,而不需要关心内部的变化。但是使用调停者的用户是多个的。Facade是对一个对象子系统的抽象,从而提供了一个更为方便的接口,它的协议是单向的;Mediator提供了各Colleague对象不支持或不能支持的协作行为,而且协议是多向的。
调停者和colleague是互相关联的。所以图和工厂方法的类似,主要是工厂方法还有另外一个client类,所以不要弄混!
Mediator(抽象中介者)
中介者定义一个接口用于与各同事(Colleague)对象通信
ConcreteMediator(具体中介者)
具体中介者通过协调各同事对象实现协作行为。了解并维护它的各个同事
Colleague(同事类)
每一个同事类都知道它的中介者对象。每一个同事对象在需与其他的同事通信的时候,与它
的中介者通信
public abstract class Mediator
{
protected ArrayList colleagues;
public void register(Colleague colleague)
{
colleagues.add(colleague);
}
public abstract void operation();
}
public class ConcreteMediator extends Mediator
{
public void operation()
{
......
((Colleague)(colleagues.get(0))).method1();
......
}
}
public abstract class Colleague
{
protected Mediator mediator;
public Colleague(Mediator mediator)
{
this.mediator=mediator;
}
public abstract void method1();
public abstract void method2();
}
public class ConcreteColleague extends Colleague
{
public ConcreteColleague(Mediator mediator)
{
super(mediator);
}
public void method1()
{
......
}
public void method2()
{
mediator.operation1();
}
}
Mediator模式封装的是交互
--------注重封装对象间的交互,支持对象交互的变化
应用情况:
一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
想定制一个分布在多个类中的行为,而又不想生成太多的子类。