在本教程中,我们将学习一种行为模式,该行为模式将促进彼此通信的多个对象之间的松散耦合。 Mediator设计模式背后的想法是拥有一个中心对象,该对象封装了一组对象之间的交互方式。
在调解器模式中,我们在称为调解器的单独类中提取不同类之间的所有关系。 这使我们能够在不影响整个系统的情况下对一个组件进行更改。
因此,我们拥有一个松散耦合的系统,它更易于扩展和维护。
UML表示形式:
我们可以借助以下UML图来表示调解器模式:
在这里,我们有:
- 介体:定义同事之间进行交流的契约的接口或抽象类
- ConcreteMediator:实现调解员合同的类; 它了解所有同事及其相互交流。 同事之间的任何交流都只能通过调解员进行
- 同事:代表我们系统组件的接口或抽象类
- ConcreteColleague:实现Colleague界面并愿意彼此交互的类
实施中介者模式:
让我们以一个航空交通控制系统为例。
每个航班都需要知道其着陆的可用跑道。 如果我们允许飞机之间相互通信以使他们找到可用的跑道,则会导致混乱。 相反, 最好有一个飞机交通控制室,该室可以跟踪所有可用跑道并将其分配给飞机。
让我们从定义AircraftMediator和AircraftTrafficControlRoom开始 :
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