Delegációminta

Szoftverfejlesztésben a delegációminta az objektumorientált programtervezési mintákhoz tartozik. Lehetővé teszi egy objektum-összetétel számára, hogy ugyanolyan jellegű kód-újrafelhasználást érjen el, mint például az öröklődés.

Delegálás során egy kérés úgy kezelődik, hogy egy objektum ezt a kérést egy második objektumra (a meghatalmazottra) átruházza. A meghatalmazott az csak egy segédobjektum az eredetinek a környezetével. A delegálás nyelvi szintű támogatásával ezt úgy hajtják végre implicit módon, hogy a "self" kulcsszó segítségével az eredeti (küldő) objektumra utalnak, és nem a megbízottra (a fogadó objektumra). A delegációmintában ezt inkább úgy érik el, hogy az eredeti objektumot közvetlenül a meghatalmazottnak adjuk át, például egy metódus változójaként.[1] Vegyük figyelembe, hogy a "delegálást" gyakran helytelenül használják a továbbítás pontos fogalmaként, amikor a küldő objektum egyszerűen a fogadó objektum megfelelő tagját használja.

Vegyük figyelembe, hogy ez a cikk inkább a "kérések küldését/fogadását" mutatja be két objektum között, és nem az "objektum/meghatalmazott fogadását". Kihangsúlyozza, hogy mely objektumok küldik és fogadják a delegálási hívást, és nem pedig az eredeti hívást.

DefinícióSzerkesztés

1994-ben Grady Booch a következő definícióját határozta meg a delegációnak:

„A delegálás egy módja annak, hogy az objektum-összetétel ugyanolyan erőteljes legyen újrafelhasználás szempontjából, mint az öröklődés [Lie86, JZ91]. A delegálás során két objektum vesz részt a kérelem kezelésében: a fogadó objektum műveleteket "delegál" a megbízottjának. Ez hasonló az alosztályokhoz, amelyek továbbítják a kérelmeket a szülőosztályokhoz. De öröklés esetén az örökölt művelet mindig utalhat a fogadó objektumra a "this" kulcsszó használatával, például a C++ programozási nyelvben és a "self" kulcsszó használatával a Smalltalkban. A delegálással azonos hatás elérése érdekében a fogadó átadja magát a megbízottnak, hogy a delegált művelet magára a fogadóra utaljon.[2]

PéldaSzerkesztés

Az alábbi példában (a Kotlin programozási nyelv használatával) a Window osztály delegálja az area() metódus hívását a belső Rectangle objektumának (a megbízottjának).

class Rectangle(val width: Int, val height: Int) {
    fun area() = width * height
}

class Window(val bounds: Rectangle) {
    // Delegation
    fun area() = bounds.area()
}

Nyelvi támogatottságSzerkesztés

Egyes nyelvek külön támogatják a beépített delegációt.[3] Például ha a Kotlin programozási nyelven írnánk a példát:

interface ClosedShape {
    fun area(): Int
}

class Rectangle(val width: Int, val height: Int) : ClosedShape {
    override fun area() = width * height
}

class Window(private val bounds: ClosedShape) : ClosedShape by bounds

ForrásokSzerkesztés

  1. Gamma et al. 1994
  2. Design patterns : elements of reusable object-oriented software, 14. print., Reading, Mass.: Addison-Wesley, 20. o. (1995. május 2.). ISBN 0-201-63361-2 
  3. Delegation - Kotlin Programming Language. Kotlin . (Hozzáférés: 2019. március 23.)

FordításSzerkesztés

  • Ez a szócikk részben vagy egészben a Delegation pattern című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

További információkSzerkesztés