Sobes.tech
Middle

Kokius projektavimo modelius galima naudoti Kotlin kalboje?

sobes.tech AI

Atsakymas iš AI

Dažnai naudojami šie modeliai Kotlin:

  • Singleton: Patogiai įgyvendinamas naudojant object.
    object MySingleton {
        fun doSomething() {
            // ...
        }
    }
    
  • Factory Method: Naudojama abstrakti funkcija superklase ar sąsajoje, kurią įgyvendina pogrupiai objektų kūrimui.
    interface Product {
        fun operation()
    }
    
    class ConcreteProductA : Product {
        override fun operation() {
            // ...
        }
    }
    
    abstract class Creator {
        abstract fun factoryMethod(): Product
    
        fun someOperation(): Product {
            val product = factoryMethod()
            // ...
            return product
        }
    }
    
    class ConcreteCreatorA : Creator() {
        override fun factoryMethod(): Product {
            return ConcreteProductA()
        }
    }
    
  • Abstract Factory: Fekalų grupė, skirta kurti susijusius objektų šeimas.
    interface AbstractProductA {
        fun usefulFunctionA()
    }
    
    interface AbstractProductB {
        fun usefulFunctionB()
        fun anotherUsefulFunctionB(collaborator: AbstractProductA)
    }
    
    interface AbstractFactory {
        fun createProductA(): AbstractProductA
        fun createProductB(): AbstractProductB
    }
    // Konkrečios įgyvendinimai...
    
  • Builder: Supaprastina sudėtingų objektų kūrimą etapais.
    class Pizza private constructor(
        val crust: String,
        val sauce: String?,
        val toppings: List<String>
    ) {
        data class Builder(
            var crust: String = "thin",
            var sauce: String? = null,
            val toppings: MutableList<String> = mutableListOf()
        ) {
            fun withCrust(crust: String) = apply { this.crust = crust }
            fun withSauce(sauce: String) = apply { this.sauce = sauce }
            fun addTopping(topping: String) = apply { this.toppings.add(topping) }
            fun build() = Pizza(crust, sauce, toppings)
        }
    }
    
    fun main() {
        val pizza = Pizza.Builder()
            .withCrust("thick")
            .withSauce("tomato")
            .addTopping("pepperoni")
            .addTopping("mushrooms")
            .build()
        // ... naudoti pica
    }
    
  • Adapter: Leidžia nesuderinamiems sąsajų objektams dirbti kartu.
    open class Adaptee {
        fun specificOperation() {
            // ...
        }
    }
    
    interface Target {
        fun operation()
    }
    
    class Adapter(private val adaptee: Adaptee) : Target {
        override fun operation() {
            adaptee.specificOperation()
        }
    }
    
  • Decorator: Prideda naujų funkcijų prie esamų objektų jų keisti nereikia. Kotlin plėtiniai ir delegavimas labai padeda.
    interface DataSource {
        fun readData(): String
        fun writeData(data: String)
    }
    
    class FileDataSource(private val filename: String) : DataSource {
        override fun readData(): String {
            // Skaityti iš failo
            return ""
        }
    
        override fun writeData(data: String) {
            // Rašyti į failą
        }
    }
    
    class EncryptionDecorator(private val source: DataSource) : DataSource by source {
        override fun readData(): String {
            // Iššifruoti duomenis
            val data = source.readData()
            return data // iššifruoti duomenys
        }
    
        override fun writeData(data: String) {
            // Užšifruoti duomenis
            source.writeData(data) // užšifruoti duomenys
        }
    }
    
  • Observer: Apibrėžia "vienas su daug" priklausomybę. Coroutines Flow ir Kotlin deleguoti savybės gali būti naudojamos.
    // Paprasta realizacija be Flow
    interface Observer {
        fun update(message: String)
    }
    
    class Subject {
        private val observers = mutableListOf<Observer>()
    
        fun attach(observer: Observer) {
            observers.add(observer)
        }
    
        fun detach(observer: Observer) {
            observers.remove(observer)
        }
    
        fun notifyObservers(message: String) {
            observers.forEach { it.update(message) }
        }
    }
    
  • Strategy: Apibrėžia algoritmų šeimą, juos įkapsuliuoja ir leidžia keisti jų naudojimą.
    interface PaymentStrategy {
        fun pay(amount: Double)
    }
    
    class PayByCreditCard(private val cardNumber: String) : PaymentStrategy {
        override fun pay(amount: Double) {
            println("Mokėjimas $amount naudojant kreditinę kortelę $cardNumber")
        }
    }
    
    class PayByPayPal(private val email: String) : PaymentStrategy {
        override fun pay(amount: Double) {
            println("Mokėjimas $amount naudojant PayPal $email")
        }
    }
    
    class Order(private val paymentStrategy: PaymentStrategy) {
        fun processOrder(amount: Double) {
            // ... kai kurie užsakymo procesai
            paymentStrategy.pay(amount)
        }
    }
    
  • State: Leidžia objektui keisti savo elgesį priklausomai nuo vidinės būsenos. Sealed klasės ir when išraiškos tai palengvina.
    sealed class State {
        object Idle : State()
        object Loading : State()
        data class Error(val message: String) : State()
        data class Success(val data: Any) : State()
    }
    
    class Context {
        var state: State = State.Idle
    
        fun handleEvent() {
            when (state) {
                State.Idle -> {
                    println("Tvarkau įvykį Idle būsenoje")
                    state = State.Loading
                }
                State.Loading -> {
                    println("Tvarkau įvykį Loading būsenoje, ignoruoju")
                }
                is State.Error -> {
                    println("Tvarkau įvykį Error būsenoje: ${state.message}")
                    // Galbūt pereiti į kitą būseną
                }
                is State.Success -> {
                    println("Tvarkau įvykį Success būsenoje: ${state.data}")
                    // Galbūt pereiti į kitą būseną
                }
            }
        }
    }
    
  • Repository: Abstrakcionuoja duomenų prieigos logiką nuo verslo logikos.

Daugiau modelių, tokių kaip Facade, Proxy, Command, Iterator, Template Method ir Visitor, taip pat taikomi Kotlin. Kotlin kalbos ypatybės, tokios kaip išplėtimo funkcijos, delegavimas, duomenų klasės ir sealed klasės, dažnai daro modelių įgyvendinimą idiomatiškesnį ir glaustesnį.