中介者设计模式是一种重要且应用广泛的行为设计模式。 Mediator 通过在两者之间引入一个层来实现对象的解耦,以便对象之间的交互通过该层发生。如果对象之间直接交互,则系统组件之间紧密耦合,维护成本更高,并且不难扩展。中介者模式侧重于在对象之间提供中介者进行通信,并帮助实现对象之间的解耦。
空中交通管制员是调解员模式的一个很好的例子,其中机场控制室充当不同航班之间通信的调解员。 Mediator 充当对象之间的路由器,它可以拥有自己的逻辑来提供通信方式。
UML 图中介器设计模式
设计组件
- Mediator :它定义了同事对象之间通信的接口。
- ConcreteMediator :实现中介接口,协调同事对象之间的通信。
- 同事:它定义了与其他同事交流的接口
- ConcreteColleague :它实现同事接口并通过它的中介与其他同事通信
让我们看一个 Mediator 设计模式的例子。
class ATCMediator implements IATCMediator
{
private Flight flight;
private Runway runway;
public boolean land;
public void registerRunway(Runway runway)
{
this.runway = runway;
}
public void registerFlight(Flight flight)
{
this.flight = flight;
}
public boolean isLandingOk()
{
return land;
}
@Override
public void setLandingStatus(boolean status)
{
land = status;
}
}
interface Command
{
void land();
}
interface IATCMediator
{
public void registerRunway(Runway runway);
public void registerFlight(Flight flight);
public boolean isLandingOk();
public void setLandingStatus(boolean status);
}
class Flight implements Command
{
private IATCMediator atcMediator;
public Flight(IATCMediator atcMediator)
{
this.atcMediator = atcMediator;
}
public void land()
{
if (atcMediator.isLandingOk())
{
System.out.println("Successfully Landed.");
atcMediator.setLandingStatus(true);
}
else
System.out.println("Waiting for landing.");
}
public void getReady()
{
System.out.println("Ready for landing.");
}
}
class Runway implements Command
{
private IATCMediator atcMediator;
public Runway(IATCMediator atcMediator)
{
this.atcMediator = atcMediator;
atcMediator.setLandingStatus(true);
}
@Override
public void land()
{
System.out.println("Landing permission granted.");
atcMediator.setLandingStatus(true);
}
}
class MediatorDesignPattern
{
public static void main(String args[])
{
IATCMediator atcMediator = new ATCMediator();
Flight sparrow101 = new Flight(atcMediator);
Runway mainRunway = new Runway(atcMediator);
atcMediator.registerFlight(sparrow101);
atcMediator.registerRunway(mainRunway);
sparrow101.getReady();
mainRunway.land();
sparrow101.land();
}
}
输出:
Ready for landing.
Landing permission granted.
Successfully Landed.
优势
- 它限制了子类化。中介者将行为本地化,否则将分布在多个对象中。更改此行为只需要继承 Mediator,Colleague 类可以按原样重用。
坏处
- 它集中控制。中介者模式用交互的复杂性换取中介者的复杂性。因为中介器封装了协议,所以它可以变得比任何单个同事都更复杂。这会使中介本身成为一个难以维护的巨石