Kotlin mediator pattern

How to write a mediator pattern in Kotlin

An example of a mediator pattern in Kotlin.

Table of contents for design patterns in Kotlin

In software engineering, the mediator pattern defines an object that encapsulates how a set of objects interact. This pattern is considered to be a behavioral pattern due to the way it can alter the program’s running behavior. Wikipedia

Example:

Gateway

class Gateway(
    private val mediator: GatewayMediator,
    private val name: String
) {

    fun send(msg: String) {
        mediator.send(msg, this)
    }

    fun receive(msg: String, from: Gateway) {
        println("$name received message: $msg from: ${from.name}")
    }
}

Mediator

class GatewayMediator {

    private val gateways = mutableListOf<Gateway>()

    fun send(msg: String, from: Gateway) {
        gateways.filter { it != from }
            .forEach { it.receive(msg, from) }
    }

    fun addGateway(gateway: Gateway) = gateways.add(gateway)
}

Usage:

fun main() {
    val mediator = GatewayMediator()
    val gatewayA = Gateway(mediator, "A").also { mediator.addGateway(it) }
    val gatewayB = Gateway(mediator, "B").also { mediator.addGateway(it) }
    val gatewayC = Gateway(mediator, "C").also { mediator.addGateway(it) }

    gatewayA.send("New order")
    gatewayB.send("New user")
    gatewayC.send("New event")
}

Result

B received message: New order from: A
C received message: New order from: A
A received message: New user from: B
C received message: New user from: B
A received message: New event from: C
B received message: New event from: C