📜  中介者设计模式

📅  最后修改于: 2021-09-10 02:51:29             🧑  作者: Mango

中介者设计模式是一种重要且应用广泛的行为设计模式。 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 类可以按原样重用。

坏处

  • 它集中控制。中介者模式用交互的复杂性换取中介者的复杂性。因为中介器封装了协议,所以它可以变得比任何单个同事都更复杂。这会使中介本身成为一个难以维护的巨石