„Díszítő programtervezési minta” változatai közötti eltérés

[ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
BinBot (vitalap | szerkesztései)
a -készítés csatolása az előtaghoz vagy birtokos szerkezetté alakítása a helyesírás nagyobb dicsőségére (kézi botszerkesztés)
B.Zsoltbot (vitalap | szerkesztései)
a clean up, replaced: *[ → * [, <br> → <br /> (4), [[Image: → [[Fájl: AWB
13. sor:
# a konkrét díszítő osztályban felüldefiniálhatjuk bármelyik Komponens metódust, amelyik viselkedését módosítani szükséges.
 
Ezt a mintát arra tervezték, hogy többszörös díszítőket lehessen egymásra halmozni a másik tetején, minden alkalommal új funkcionalitást adva hozzá a felüldefiniált metódus(ok)hoz.
 
Jegyezzük meg, hogy a díszítők és az eredeti osztály objektum közös funkcionalitás halmazon osztoznak. A fenti diagramban "operation()" metódus elérhető a díszítőkben és a díszített objektumban egyaránt.
 
A díszítő jellegzetességek lehetnek metódusok, tulajdonságok, vagy egyéb tagok, melyeket általában egy interfész deklarál vagy osztály öröklődés definiál, amelyet a díszítők megosztanak egymás közt és a díszítő objektum között. A fenti példában a "Komponens" osztályt öröklik mind a konkrét komponens, mind a díszítőből (Decorator) származó alosztályok.
 
A díszítő minta alternatívája az [[alosztály (informatika)|alosztályok képzésének]]. Az alosztályok képzésével viselkedések adhatók hozzá [[fordítási idő]]ben és a változás kihat az eredeti osztály összes példányára, míg a díszítő minta használatával biztosítható új viselkedés [[futási idő (program életciklus fázis)|futási időben]] egyéni objektumok számára.
 
Ez a különbség akkor válik nagyon fontossá, amikor sokféle ''független'' módon lehetséges a funkcionalitás kiterjesztése. Néhány [[objektumorientált programozás|objektumorientált programozási nyelvben]] az osztályok létrehozása futás időben nem lehetséges, és tipikusan nem lehetséges megjósolni tervezési időben, hogy a kiterjesztések milyen kombinációjára lesz szükség később. Ez azt jelentené, hogy egy új osztálynak el kéne készíteni az összes lehetséges kombinációját. Ezzel szemben a díszítők objektumok, melyek futási időben jönnek létre, kombinálhatók használat előtt. Az I/O folyamok megvalósítása mind a [[Java Platform, Standard Edition#java.io|Java]]-ban, mind a [[.NET keretrendszer]]ben alkalmazzák a díszítő mintát.
 
==Motiváció==
[[ImageFájl:UML2 Decorator Pattern.png|thumb|400px|Windows példa UML Diagramja]]
Példaként vegyünk egy ablakot egy [[ablakozó rendszerben]]. Ahhoz, hogy egy ablak tartalmát [[görgetés|görgetni]] tudjuk, szükség lehet arra, hogy megfelelő vízszintes ill. függőleges [[görgetősáv]]ot adjunk hozzá. Tegyük fel, hogy az ablakokat az ''Window'' osztály példányai reprezentálnak, és tegyük fel, hogy ennek az osztálynak nem létezik görgetősáv hozzáadása funkcionalitása. Készíthetünk alosztályt a ''ScrollingWindow'' néven, amely ellátja ezt a feladatot, vagy készíthetünk egy ''ScrollingWindowDecorator'', amely hozzáadja ezt a funkcionalitást létező ''Window'' objektumokhoz. Ezen a ponton, bármelyik megoldás megfelelő lenne.
 
Most tegyük fel, hogy szeretnénk olyan képességet is, amely keretet ad hozzá az ablakunkhoz. Megint az eredeti ''Window'' osztálynak nincs támogatása ehhez. A ''ScrollingWindow'' alosztály problémával kerül szembe, mert valójában egy új típusú ablakot hoz létre. Ha szeretnénk keretet hozzáadni az ''összes'' ablakoz, új osztályokat kell létrehoznunk ''WindowWithBorder'' (keretes ablak) és ''ScrollingWindowWithBorder'' (görgetősávos keretes ablak) néven. Nyilvánvalóan ez a probléma rosszabbra fordul, minden új tulajdonság hozzáadásakor. A díszítő megoldás esetén csak egyszerűen készítünk egy új ''BorderedWindowDecorator'' (keretes ablak díszítőt) &mdash; futási időben, díszíthetjük a létező ablakot ''ScrollingWindowDecorator''-ral (görgethető ablak díszítővel) vagy ''BorderedWindowDecorator''-ral (keretes ablak díszítővel) vagy mindkettővel, igény szerint.
 
Megjegyzendő, hogy az előző példában a "SimpleWindow" és "Window" osztályok megvalósítják a "Window" interfészt, amely definiálja a "draw();" metódust és "getDescription();" metódust. Ezek szükségesek ebben a felállásban, hogy díszíteni tudjuk az ablak vezérlőt.
 
Egy másik jó példa, ahol a díszítő használata kívánatos lehet, pl. ha egy objektum tulajdonságainak ill. metódusainak az elérését korlátozni szükséges néhány szabály halmaz szerint vagy esetleg számos párhuzamosan használt szabály halmaz szerint (pl. különböző felhasználói hitelesítések esetén, stb.). Ebben az esetben az eredeti objektumban az elérések szabályzásának megvalósítása helyett, az változatlanul hagyható és bárminemű korlátozástól mentesen használható. Az eredeti objektum becsomagolható egy elérést szabályzó díszítő objektumba, amely kizárólag szolgálhatja ki az eredeti objektum interfészének egy megengedett részhalmazát.
330. sor:
 
};
 
 
</source>
356. sor:
 
<code>
Cost: 1.0; Ingredients: Coffee<br />
Cost: 1.5; Ingredients: Coffee, Milk<br />
Cost: 1.7; Ingredients: Coffee, Whip<br />
Cost: 2.2; Ingredients: Coffee, Whip, Milk<br />
</code>
 
377. sor:
 
==Külső hivatkozások==
* [http://c2.com/cgi/wiki?DecoratorPattern Decorator pattern description from the Portland Pattern Repository]
 
==Fordítás==