Implementación Mediator Pattern - lenoryv/Design-Patterns GitHub Wiki
Ahora que tenemos una idea clara de la teoría, veamos un ejemplo para comprender mejor el concepto en la práctica.
El controlador de tráfico aéreo (ATC) es un mediador entre vuelos. Ayuda en la comunicación entre vuelos y coordina / controla el aterrizaje y el despegue.
Código de implementación:
interface Command {
fun land()
}
class Flight(private val atcMediator: IATCMediator) : Command {
override fun land() {
if (atcMediator.isLandingOk) {
println("Landing done....")
atcMediator.setLandingStatus(true)
} else
println("Will wait to land....")
}
fun getReady() {
println("Getting ready...")
}
}
class Runway(private val atcMediator: IATCMediator) : Command {
init {
atcMediator.setLandingStatus(true)
}
override fun land() {
println("Landing permission granted...")
atcMediator.setLandingStatus(true)
}
}
interface IATCMediator {
val isLandingOk: Boolean
fun registerRunway(runway: Runway)
fun registerFlight(flight: Flight)
fun setLandingStatus(status: Boolean)
}
No es necesario que dos vuelos interactúen directamente y no hay dependencia entre ellos. Esta dependencia la resuelve el mediador ATC.
Si ATC no está allí, todos los vuelos tienen que interactuar entre sí y la gestión del espectáculo será muy difícil y las cosas pueden salir mal.
class ATCMediator : IATCMediator {
private var flight: Flight? = null
private var runway: Runway? = null
override var isLandingOk: Boolean = false
override fun registerRunway(runway: Runway) {
this.runway = runway
}
override fun registerFlight(flight: Flight) {
this.flight = flight
}
override fun setLandingStatus(status: Boolean) {
isLandingOk = status
}
}
fun main(args: Array<String>) {
val atcMediator = ATCMediator()
val sparrow101 = Flight(atcMediator)
val mainRunway = Runway(atcMediator)
atcMediator.registerFlight(sparrow101)
atcMediator.registerRunway(mainRunway)
sparrow101.getReady()
mainRunway.land()
sparrow101.land()
}
La salida del patrón de mediador de Kotlin:
Getting ready...
Landing permission granted...
Landing done....