Kotlin adapter pattern

How to write an adapter pattern in Kotlin

An example of an adapter pattern in Kotlin.

Table of contents for design patterns in Kotlin

In software engineering, the adapter pattern is a software design pattern (also known as wrapper, an alternative naming shared with the decorator pattern) that allows the interface of an existing class to be used as another interface. Wikipedia

Example:

TemperatureSensorCelsius

interface TemperatureSensorCelsius {
    fun getTemperatureCelsius(): Double
}

TemperatureSensorFahrenheit

class TemperatureSensorFahrenheit {
    fun getTemperatureFahrenheit(): Double = 451.0
}

FahrenheitToCelsiusAdapter

class FahrenheitToCelsiusAdapter(
    private val sensorFahrenheit: TemperatureSensorFahrenheit
) : TemperatureSensorCelsius {
    override fun getTemperatureCelsius(): Double = (sensorFahrenheit.getTemperatureFahrenheit() - 32) * 5 / 9
}

TemperatureControllerCelsius

class TemperatureControllerCelsius {

    var sensor: TemperatureSensorCelsius? = null

    fun check() {
        sensor?.let {
            println("Temperature ${"%.1f".format(it.getTemperatureCelsius())} C")
        } ?: println("No sensor")
    }
}

Usage

fun main() {
    val temperatureSensorCelsius = object : TemperatureSensorCelsius {
        override fun getTemperatureCelsius(): Double = 36.6
    }
    val temperatureSensorFahrenheit =  TemperatureSensorFahrenheit()

    with(TemperatureControllerCelsius()){
        check()
        sensor = temperatureSensorCelsius
        check()
        sensor = FahrenheitToCelsiusAdapter(temperatureSensorFahrenheit)
        check()
    }
}

Result

No sensor
Temperature 36.6 C
Temperature 232.8 C