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.

Escenario de ejemplo

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....

⚠️ **GitHub.com Fallback** ⚠️