Kotlin 设计模式-适配器

时间:2021-01-19 20:04:32

前言

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

摘自百度百科《适配器模式》


Kotlin中的适配器模式

需要特殊说明一个Interface在Java 和 Kotlin中的不同。
Java中的Interface 中 可以声明静态变量、抽象方法。
Kotlin中在接口中声明的变量不再是静态变量,而是单纯的变量,但变量可以是抽象变量也可以是有get\set方法的计算变量。
kotlin中的Interface 例子:


interface MyInterface {
val property: Int // 抽象变量
val propertyWithImplementation: String //计算变量
get() = "foo"

fun foo() {
print(property)
}
}

class Child :MyInterface {
override val property: Int = 29
}

Show me code

interface Temperature {
var temperature: Double
}

class CelsiusTemperature(override var temperature: Double) : Temperature

class FahrenheitTemperature(var celsiusTemperature: CelsiusTemperature) : Temperature {

override var temperature: Double
get() = convertCelsiusToFahrenheit(celsiusTemperature.temperature)
set(temperatureInF) {
celsiusTemperature.temperature = convertFahrenheitToCelsius(temperatureInF)
}

private fun convertFahrenheitToCelsius(f: Double): Double = (f - 32) * 5 / 9

private fun convertCelsiusToFahrenheit(c: Double): Double = (c * 9 / 5) + 32
}

调用代码:

val celsiusTemperature = CelsiusTemperature(0.0)
val fahrenheitTemperature = FahrenheitTemperature(celsiusTemperature)

celsiusTemperature.temperature = 36.6
println("${celsiusTemperature.temperature} C -> ${fahrenheitTemperature.temperature} F")

fahrenheitTemperature.temperature = 100.0
println("${fahrenheitTemperature.temperature} F -> ${celsiusTemperature.temperature} C")