Delegációs minta Kotlinban

1. Áttekintés

Sok olyan felhasználási eset fordul elő, amikor az átruházást részesítik előnyben az öröklés helyett. Kotlin ehhez nagy nyelvi szintű támogatást nyújt.

Ebben az oktatóanyagban beszélünk Kotlin delegációs mintájának natív támogatásáról és működés közben látni.

2. Végrehajtás

Először tegyük fel, hogy van egy kódpélda az alábbi felépítéssel egy harmadik fél könyvtárában:

felület Producer {fun produc (): String} osztály ProducerImpl: Producer {override fun produc ((= = ProducerImpl "})

Következő, díszítsük a meglévő megvalósításta „by” kulcsszó használatával és adja hozzá a további szükséges feldolgozást:

class EnhancedProducer (privát val delegate: Producer): Producer delegáltak szerint {override fun produc ((= = $ {delegate.produce ()} és EnhancedProducer "}

Tehát ebben a példában jeleztük, hogy a EnhancedProducer osztály be fogja zárni a delegált típusú objektum Termelő. És használhatja a Termelő végrehajtás.

Végül ellenőrizzük, hogy a várt módon működik-e:

val producer = EnhancedProducer (ProducerImpl ()) assertThat (producer.produce ()). isEqualTo ("ProducerImpl és EnhancedProducer")

3. Használjon tokokat

Most nézzünk meg két általános felhasználási esetet a delegálási mintára.

Először is használhatjuk a delegálási mintát több interfész megvalósításához a meglévő megvalósítások segítségével:

class CompositeService: UserService by UserServiceImpl (), MessageService by MessageServiceImpl ()

Másodszor használhatjuk a delegálást a meglévő megvalósítás fokozása érdekében.

Ez utóbbit tettük az előző részben. De az alábbihoz hasonló valósabb példa különösen hasznos, ha nem tudjuk módosítani a meglévő megvalósítást - például harmadik fél könyvtárának kódját:

class SynchronizedProducer (privát val delegate: Producer): Producer delegáltak szerint {private val lock = ReentrantLock () felülírja a szórakoztató produkciót (): String {lock.withLock {return delegate.produce ()}}}

4. A delegálás nem öröklődés

Most mindig emlékeznünk kell erre a küldött semmit sem tud a lakberendezőről. Tehát nem szabad kipróbálni a GoF sablon módszer-szerű megközelítés velük.

Vegyünk egy példát:

interfész szolgáltatás {val seed: Int fun serve (action: (Int) -> Unit)} class ServiceImpl: Service {over valide seed = 1 override fun serve (action: (Int) -> Unit) {action (seed)}} class ServiceDecorator: ServiceImpl által nyújtott szolgáltatás () {felülbírálja a val seed = 2}

Itt a küldött (ServiceImpl) a közös felületen definiált tulajdonságot használ, és mi felülírjuk a dekorátorban (ServiceDecorator). Ez azonban nem érinti a küldött feldolgozását:

val service = ServiceDecorator () service.serve {assertThat (it) .isEqualTo (1)}

Végül fontos megjegyezni, hogy Kotlinban nemcsak interfészekre, hanem külön tulajdonságokra is delegálhatjuk.

5. Következtetés

Ebben az oktatóanyagban a Kotlin interfész delegálásáról beszélgettünk - mikor kell használni, hogyan kell konfigurálni, és annak figyelmeztetéseiről.

Szokás szerint a cikk teljes forráskódja elérhető a GitHubon.