Kotlin 设计模式,观察者问题
Kotlin Design Pattern, Problem with Observer
我尝试了不同的方法,但结果仍然不尽如人意。我必须使用一些设计模式在 Kotlin 中创建一个小型天气应用程序。
interface Sensor {
fun getTemperature() : Float
}
class RandomSensor () : Sensor {
override fun getTemperature(): Float {
var randomTemp : Double = Random.nextDouble (0.0, 40.00)
return randomTemp.toFloat()
}
}
class Thermometer (var sensor: Sensor) {
var newTemp = this.sensor.getTemperature()
val tempwerte = mutableListOf<Float>(newTemp)
val observers = mutableListOf<TemperaturObserver>()
fun register(observer:TemperaturObserver) {
observers.add(observer)
}
fun remove(observer: TemperaturObserver) {
observers.remove(observer)
}
fun dataChanged() {
observers.forEach {it.update(newTemp)}
}
fun messen() {
var n = 100
for (i in 0 until n) {
newTemp = this.sensor.getTemperature()
if(i != n) {
dataChanged()
tempwerte.add(newTemp)
}
}
}
fun getTenlastItems () = tempwerte.takeLast(10)
fun getHundredItems () = tempwerte.take (100)
}
观察者"weatherReport"应该收集10个项目(温度),打印它们并收集接下来的10个项目等等
我的解决方案
interface TemperaturObserver {
fun update (newTemp : Float)
}
class WeatherReport (private var station : Thermometer) : TemperaturObserver {
override fun update (newTemp: Float) {
var newList = mutableListOf<Float>(newTemp)
while (newList.size != 10) {
newList.add(newTemp)
}
println(newList)
}
}
创建此输出
[40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0]
[24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0]
等....
有什么解决问题的想法吗?应该是这样的:
[21.0, 23.0, 0.0, 1.0, 35.0, 4.0, 14.0, 3.0, 16.0, 36.0]
[22.0, 27.0, 21.0, 32.0, 20.0, 31.0, 37.0, 33.0, 24.0, 2.0]
等...
谢谢!
观察到的输出是因为您在 WeatherReport.update
方法中创建了一个新列表并用相同的 newTemp
值填充了十次。
如果您想收集值并在收集到十个值后将它们打印出来,您应该创建一个列表一次,然后一次填充一个值并检查它是否已达到十个值:
class WeatherReport(private var station: Thermometer) : TemperaturObserver {
val observedValues = mutableListOf<Float>()
override fun update(newTemp: Float) {
observedValues.add(newTemp)
if (observedValues.size >= 10) {
println(observedValues)
observedValues.clear()
}
}
}
我尝试了不同的方法,但结果仍然不尽如人意。我必须使用一些设计模式在 Kotlin 中创建一个小型天气应用程序。
interface Sensor {
fun getTemperature() : Float
}
class RandomSensor () : Sensor {
override fun getTemperature(): Float {
var randomTemp : Double = Random.nextDouble (0.0, 40.00)
return randomTemp.toFloat()
}
}
class Thermometer (var sensor: Sensor) {
var newTemp = this.sensor.getTemperature()
val tempwerte = mutableListOf<Float>(newTemp)
val observers = mutableListOf<TemperaturObserver>()
fun register(observer:TemperaturObserver) {
observers.add(observer)
}
fun remove(observer: TemperaturObserver) {
observers.remove(observer)
}
fun dataChanged() {
observers.forEach {it.update(newTemp)}
}
fun messen() {
var n = 100
for (i in 0 until n) {
newTemp = this.sensor.getTemperature()
if(i != n) {
dataChanged()
tempwerte.add(newTemp)
}
}
}
fun getTenlastItems () = tempwerte.takeLast(10)
fun getHundredItems () = tempwerte.take (100)
}
观察者"weatherReport"应该收集10个项目(温度),打印它们并收集接下来的10个项目等等
我的解决方案
interface TemperaturObserver {
fun update (newTemp : Float)
}
class WeatherReport (private var station : Thermometer) : TemperaturObserver {
override fun update (newTemp: Float) {
var newList = mutableListOf<Float>(newTemp)
while (newList.size != 10) {
newList.add(newTemp)
}
println(newList)
}
}
创建此输出
[40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0]
[24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0, 24.0]
等....
有什么解决问题的想法吗?应该是这样的:
[21.0, 23.0, 0.0, 1.0, 35.0, 4.0, 14.0, 3.0, 16.0, 36.0]
[22.0, 27.0, 21.0, 32.0, 20.0, 31.0, 37.0, 33.0, 24.0, 2.0]
等...
谢谢!
观察到的输出是因为您在 WeatherReport.update
方法中创建了一个新列表并用相同的 newTemp
值填充了十次。
如果您想收集值并在收集到十个值后将它们打印出来,您应该创建一个列表一次,然后一次填充一个值并检查它是否已达到十个值:
class WeatherReport(private var station: Thermometer) : TemperaturObserver {
val observedValues = mutableListOf<Float>()
override fun update(newTemp: Float) {
observedValues.add(newTemp)
if (observedValues.size >= 10) {
println(observedValues)
observedValues.clear()
}
}
}