【问题标题】:Kotlin Design Pattern, Problem with ObserverKotlin 设计模式,观察者的问题
【发布时间】:2019-11-11 15:35:55
【问题描述】:

我尝试了不同的方式,但结果仍然不是应有的方式。我必须使用一些设计模式在 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]

等等……

谢谢!

【问题讨论】:

    标签: kotlin design-patterns observer-pattern


    【解决方案1】:

    观察到的输出是因为您在 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()
            }
        }
    }
    

    【讨论】:

    • 非常感谢!工作正常
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多