使用Kotlin中的策略模式拆分算法和查看零件

时间:2017-08-07 15:40:19

标签: kotlin strategy-pattern

这是我想重构的代码:

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)。然后我将keys数组的特定元素添加到另一个数组(requestsUser)。

考虑到可以更改此算法,我想将算法部分封装在另一个类中。我在某处看到,在这种情况下,最好的办法是使用策略模式,但我在kotlin工作。我如何在Kotlin中实施战略模式?

1 个答案:

答案 0 :(得分:2)

它应该类似于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
    }
}

在您的班级中声明策略

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()
    }
}