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.