Dividir algorithm y ver parte usando un Patrón de estrategia en Kotlin

Este es el código que me gustaría refactorizar:

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

Como pueden ver, estoy descargando datos en una matriz llamada match. Luego analizo la misma matriz obteniendo una matriz de keys (keysArray). Luego agrego un elemento específico de la matriz de keys a otra matriz (requestsUser).

Teniendo en count que este algorithm podría cambiarse, me gustaría encapsular la parte del algorithm en otra class. Leí en alguna parte que en este tipo de situación, lo mejor que se puede hacer es usar un Patrón de estrategia, pero estoy trabajando en kotlin. ¿Cómo podría implementar un patrón de estrategia en Kotlin?

    Debería ser similar a Java.

    Supongamos que el tipo de requestsUsers es ArrayList<RequestsUser> .

    Crea la interfaz de estrategia.

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

    Implementa la interfaz.

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

    Declara la estrategia en tu class

     var strategy = StrategyImpl() //make it var so that it can be changed 

    Finalmente, use la strategy para get la list de datos y agregarla a la list.

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