Java中的中介器设计模式

在本教程中,我们将学习一种行为模式,该行为模式将促进彼此通信的多个对象之间的松散耦合。 Mediator设计模式背后的想法是拥有一个中心对象,该对象封装了一组对象之间的交互方式。

在调解器模式中,我们在称为调解器的单独类中提取不同类之间的所有关系。 这使我们能够在不影响整个系统的情况下对一个组件进行更改。

因此,我们拥有一个松散耦合的系统,它更易于扩展和维护。

UML表示形式:

我们可以借助以下UML图来表示调解器模式:

在这里,我们有:

  • 介体:定义同事之间进行交流的契约的接口或抽象
  • ConcreteMediator:实现调解员合同的类; 它了解所有同事及其相互交流。 同事之间的任何交流都只能通过调解员进行
  • 同事:代表我们系统组件的接口或抽象
  • ConcreteColleague:实现Colleague界面并愿意彼此交互的类

实施中介者模式:

让我们以一个航空交通控制系统为例。

每个航班都需要知道其着陆的可用跑道。 如果我们允许飞机之间相互通信以使他们找到可用的跑道,则会导致混乱。 相反, 最好有一个飞机交通控制室,该室可以跟踪所有可用跑道并将其分配给飞机。

让我们从定义AircraftMediatorAircraftTrafficControlRoom开始

public interface AircraftMediator {
 
    public void registerRunway(Runway runway);
    public String allotRunwayTo(Aircraft aircraft);    
    public void releaseRunwayOccupiedBy(Aircraft aircraft); 
}
 
public class AicraftTrafficControlRoom implements AircraftMediator {
    
    private LinkedList<Runway> availableRunways = new LinkedList<>(); 
    private Map<Aircraft, Runway> aircraftRunwayMap = new HashMap<>();
 
    @Override
    public void registerRunway(Runway runway) {
        this.availableRunways.add(runway);
    }
 
    @Override
    public String allotRunwayTo(Aircraft aircraft) {
        Runway nextAvailbleRunway = null;
        if(!this.availableRunways.isEmpty()) {
            nextAvailbleRunway = this.availableRunways.removeFirst();
            this.aircraftRunwayMap.put(aircraft, runway);
        }
        return nextAvailbleRunway == null ? 
          null : nextAvailbleRunway.getName();
    }
 
    @Override
    public void releaseRunwayOccupiedBy(Aircraft aircraft) {
        if(this.aircraftRunwayMap.containsKey(aircraft)) {
            Runway runway = this.aircraftRunwayMap.remove(aircraft);
            this.availableRunways.add(runway); 
        }
    }
}

空中交通管制室充当调解员,并跟踪所有可用跑道。 它负责分配和释放跑道。

定义同事:

现在,让我们定义我们的飞机 ,其实例将是同事:

public interface AircraftColleague {
    void startLanding();
    void finishLanding();
}
 
public class Aircraft implements AircraftColleague {
 
    private AircraftMediator mediator;
    private String flightName;
 
    public Aircraft(AircraftMediator mediator, String flightName) {
        this.mediator = mediator;
        this.flightName = flightName;
    }
 
    @Override
    public void startLanding() {
        String runway = this.mediator.allotRunwayTo(this);
        if(runway == null) {
            //informing passengers
            System.out.println("Due to traffic, there's a delay in landing of " + this.flightName );  
        } else {
            System.out.println("Currently landing " + this.flightName + " on " + runway);  
        }  
    }
 
    @Override
    public void finishLanding() {
       System.out.println(this.flightName + "landed successfully");
       this.mediator.releaseRunwayOccupiedBy(this);
    }
}

测试我们的实施:

让我们看看它们如何一起工作:

// In our main method
Runway runwayA = new Runway("Runway A");
 
AircraftMediator mediator = new AircraftTrafficControlRoom();
mediator.registerRunway(runwayA);
 
AircraftColleague wrightFlight = new Aircraft(mediator, "Wright Flight"); 
AircraftColleague airbusA380 = new Aircraft(mediator, "Airbus A380"); 
 
wrightFlight.startLanding(); 
airbusA380.startLanding();
wrightFlight.finishLanding();

执行上述代码后,我们将得到以下输出:

Currently landing Wright Flight on Runway A
Due to traffic, there's a delay in landing of Airbus A380
Wright Flight landed successfully

如果我们再次尝试降落空中客车,则由于跑道现已可用,我们将能够继续进行降落。

结论:

在本教程中,我们学习了如何实现中介模式。 当我们具有多个对象相互通信的系统时,将使用中介者模式。 这种模式促进了松散的耦合,从而使系统更加灵活。

这种模式的常见应用是聊天或消息传递系统。 而且, Java Concurrency Executor的execute()方法利用了这种模式。

翻译自: https://www.javacodegeeks.com/2019/09/mediator-design-pattern-java.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值