„Tervezési minták (Sznikák)” változatai közötti eltérés
Nincs szerkesztési összefoglaló |
Nincs szerkesztési összefoglaló |
||
| 118. sor: | 118. sor: | ||
'''Használjuk, ha ''' | '''Használjuk, ha ''' | ||
* objektumok rész-egész viszonyát szeretnénk kezelni | * objektumok rész-egész viszonyát szeretnénk kezelni | ||
* a kliensek számára el akarjuk rejteni, hogy egy objektum egyedi objektum vagy kompozit objektum: bizonyos szempontból egységesen szeretnénk kezelni őket. | |||
Decorator | == Decorator == | ||
Célja: Objektumok funkciójának dinamikus kiterjesztése. Rugalmas alternatívája a leszármaztatásnak. | '''Célja:''' Objektumok funkciójának dinamikus kiterjesztése. Rugalmas alternatívája a leszármaztatásnak. | ||
Példa: Adott egy GUI keretrendszer (pl. Windows Forms-Decorator Formshoz, AWT-hez hasonló). Az ablakokokhoz, vezérlőelemekhez hozzá szeretnénk rendelni keretet (Border), görgetősávot (Scrollbar), Animációt (Animation), Árnyékot,... Ezeket tetszőleges kombinációban szeretnénk az osztályokhoz rendelni. Tegyük fel hogy beépítve NEM támogatja a keretrendszer! | '''Példa:''' Adott egy GUI keretrendszer (pl. Windows Forms-Decorator Formshoz, AWT-hez hasonló). Az ablakokokhoz, vezérlőelemekhez hozzá szeretnénk rendelni keretet (Border), görgetősávot (Scrollbar), Animációt (Animation), Árnyékot,... Ezeket tetszőleges kombinációban szeretnénk az osztályokhoz rendelni. Tegyük fel hogy beépítve NEM támogatja a keretrendszer! | ||
Használjuk, ha | '''Használjuk, ha ''' | ||
* dinamikusan szeretnénk funkcionalitást/viselkedést hozzárendelni az egyes objektumokhoz | |||
* a funkcionalitást a kliens számára átlátszó módon szeretnénk az objektumhoz rendelni | |||
* amikor a származtatás nem praktikus | |||
Előnyök | '''Előnyök ''' | ||
* sokkal rugalmasabb, mint a statikus öröklődés | |||
* több testreszabható osztály határozza meg a tulajdonságokat | |||
Hátrányok | '''Hátrányok ''' | ||
* némiképp bonyolultabb, mint az egyszerű öröklés (több osztály szerepel) | |||
* a decorator és a dekorált komponens interfésze ugyan azonos, de maga az osztály nem ugyanaz. Ha reflexióval építünk a konkrét típusra, akkor a dekorátor alkalmazása problémát okozhat. | |||
Facade | == Facade == | ||
Célja: Egységes interfészt definiál egy alrendszer interfészeinek halmazához. Magasabb | '''Célja:''' Egységes interfészt definiál egy alrendszer interfészeinek halmazához. Magasabb szintű interfészt definiál, amin keresztül könnyebb az alrendszer használata. | ||
Példa: Compiler; Többrétegű (többnyire üzleti) alkalmazások | '''Példa:''' Compiler; Többrétegű (többnyire üzleti) alkalmazások | ||
Használjuk, ha | '''Használjuk, ha ''' | ||
* egyszerű interfészt szeretnénk biztosítani egy komplex rendszer felé | |||
* számos függőség van a kliens és az alrendszerek osztályai között. Ilyenkor ha létrehozva egy Facade-ot elősegítve az alrendszer függetlenségét és a hordozhatóságot | |||
Layers (rétegelés) esetén | * Layers (rétegelés) esetén | ||
Megjegyzés | '''Megjegyzés ''' | ||
* külön döntés, hogy engedünk-e hozzáférést az alrendszerek osztályaihoz | |||
* elvileg nem akadályozza meg, hogy a kliensek felhasználják az alrendszerek osztályait, ha arra is szükségük van | |||
Proxy | == Proxy == | ||
Célja: Objektum helyett egy | '''Célja:''' Objektum helyett egy helyettesítő objektumot használ, ami szabályozza az objektumhoz való hozzáférést | ||
Példa: Szövegszerkesztő (sok nagy méretű kép megjelenítésével) | '''Példa:''' Szövegszerkesztő (sok nagy méretű kép megjelenítésével) | ||
Struktúra | '''Struktúra''' | ||
Subject: közös interfészt biztosít a Subject és a Proxy számára (ezáltal tud a minta működni) | * Subject: közös interfészt biztosít a Subject és a Proxy számára (ezáltal tud a minta működni) | ||
Realsubject: a valódi objektum, amit a proxy elrejt | * Realsubject: a valódi objektum, amit a proxy elrejt | ||
Proxy: | * Proxy: helyettesítő objektum. Tartalmaz egy referenciát a tényleges objektumra, hogy el tudja azt érni. Szabályozza a hozzáférést a tényleges objektumhoz, feladata lehet a tényleges objektum létrehozása és törlése is. | ||
Típusok | '''Típusok ''' | ||
Távoli Proxy: Távoli objektumok lokális megjelenítése átlátszó módon. A kliens nem is érzékeli, hogy a tényleges objektum egy másik címtartományban, vagy egy másik gépen van | * Távoli Proxy: Távoli objektumok lokális megjelenítése átlátszó módon. A kliens nem is érzékeli, hogy a tényleges objektum egy másik címtartományban, vagy egy másik gépen van | ||
Virtuális Proxy: Nagy erőforrás igényű objektumok igény szerinti létrehozása (pl. kép) | * Virtuális Proxy: Nagy erőforrás igényű objektumok igény szerinti létrehozása (pl. kép) | ||
Védelmi Proxy: A hozzáférést szabályozza különböz� jogok esetén | * Védelmi Proxy: A hozzáférést szabályozza különböz� jogok esetén | ||
Smart Pointer: Egy pointer egységbezárása, hogy bizonyos esetekben automatikus műveleteket hajtson végre (pl.:lockolás) | * Smart Pointer: Egy pointer egységbezárása, hogy bizonyos esetekben automatikus műveleteket hajtson végre (pl.:lockolás) | ||
Template method | == Template method == | ||
Cél: Egy műveleten belül algoritmus vázat definiál, és ennek néhány lépésének implementálását a leszármazott osztályra bízza. | '''Cél:''' Egy műveleten belül algoritmus vázat definiál, és ennek néhány lépésének implementálását a leszármazott osztályra bízza. | ||
Példa: Framework-ben dokumentum megnyitása | '''Példa:''' Framework-ben dokumentum megnyitása | ||
Előny | '''Előny ''' | ||
* lehetővé teszi, hogy az algoritmus invariáns részeit egy helyen definiáljuk, és a változó részeket a leszármazott osztályban adjuk meg. Így megoldható a kódduplikálás elkerülése: a hierarchiában a közös kódrészeket a szülő osztályban egy helyen adjuk meg (template method), ami a különböző viselkedést megvalósító egyéb műveleteket hívja meg. Ezeket a "különböző viselkedést megvalósító egyéb műveleteket" a leszármazott osztályban felül kell/lehet definiálni. | |||
Lehetővé teszi ún. hook függvények definiálását: ezek kiterjesztési pontok a kódban. | Lehetővé teszi ún. hook függvények definiálását: ezek kiterjesztési pontok a kódban. | ||
Command/Action | Command/Action | ||