使用 Kotlin 中的策略模式拆分算法并查看部分

Split algorithm and view part using a Strategy Pattern in Kotlin

这是我要重构的代码:

val postListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
            // Get Post object and use the values to update the UI
            requestsUsers?.clear()
            val match = dataSnapshot.children
            val keysArray = KeysHandler()
            if (match != null) {

                for (data in match) {
                    keysArray.addToList(data.key)
                }
                if (keysArray.list.size > 0) {
                    repeat(keysArray.list.size) { i ->
                        val onlineMatch = dataSnapshot.child(keysArray.getElement(i)).getValue(OnlineMatch::class.java)!!
                        onlineMatch.key = keysArray.list[i]
                        requestsUsers.add(onlineMatch)
                    }
                }
            }
            //Updating GUI
            updateRequests()

}

如您所见,我正在下载名为 match 的数组中的数据。然后我解析同一个数组,获取一个键数组 (keysArray)。然后我将键数组的特定元素添加到另一个数组 (requestsUser)。

考虑到这个算法可以改变我想将算法部分封装在另一个class中。我在某处读到,在这种情况下,最好的办法是使用策略模式,但我在科特林工作。我如何在 Kotlin 中实现策略模式?

应该类似于Java。

假设requestsUsers的类型是ArrayList<RequestsUser>

创建策略界面。

interface Strategy {
    fun getRequestsUsers(dataSnapshot: DataSnapshot): ArrayList<RequestsUser>
}

实现接口。

class StrategyImpl: Strategy {

    override fun getRequestsUsers(dataSnapshot: DataSnapshot): ArrayList<RequestsUser> {
        val match = dataSnapshot.children
        val keysArray = KeysHandler()
        val requestsUsers = arrayListOf<RequestsUser>()
        if (match != null) {

            for (data in match) {
                keysArray.addToList(data.key)
            }
            if (keysArray.list.size > 0) {  //this line can be omitted
                repeat(keysArray.list.size) { i ->
                    val onlineMatch = dataSnapshot.child(keysArray.getElement(i)).getValue(OnlineMatch::class.java)!!
                    onlineMatch.key = keysArray.list[i]
                    requestsUsers.add(onlineMatch)
                }
            }
        }
        return requestsUsers
    }
}

在您的 class

中声明策略
var strategy = StrategyImpl()  //make it var so that it can be changed

最后,使用strategy获取数据列表并添加到列表中。

val postListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        // Get Post object and use the values to update the UI
        requestsUsers?.clear()
        requestsUsers?.addAll(strategy.getRequestsUsers(dataSnapshot))
        //Updating GUI
        updateRequests()
    }
}