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

[nem ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
BitMiller (vitalap | szerkesztései)
BitMiller (vitalap | szerkesztései)
28. sor:
Most tegyük fel, hogy szeretnénk olyan képességet is, amely keretet ad hozzá az ablakunkhoz, de az eredeti ''Window'' osztálynak nincs támogatása ehhez sem. 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''-t (keretes ablak díszítőt) — 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 a "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ályozá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ályozó díszítő objektumba, amely kizárólagosan szolgálhatja ki az eredeti objektum interfészének egy megengedett részhalmazát.