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