„Tervezési minták (Sznikák)” változatai közötti eltérés

Kavics (vitalap | szerkesztései)
Nincs szerkesztési összefoglaló
Kavics (vitalap | szerkesztései)
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.
* 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
* 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
* a funkcionalitást a kliens számára átlátszó módon szeretnénk az objektumhoz rendelni
Amikor a származtatás nem praktikus
* amikor a származtatás nem praktikus
Előnyök:
'''Előnyök '''
Sokkal rugalmasabb, mint a statikus öröklődés
* sokkal rugalmasabb, mint a statikus öröklődés
Több testreszabható osztály határozza meg a tulajdonságokat
* 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)
* 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.
* 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 szint� interfészt definiál, amin keresztül könnyebb az alrendszer használata.
'''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é
* 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
* 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
* 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
* 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 helyettesít� objektumot használ, ami szabályozza az objektumhoz való hozzáférést
'''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: 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.
* 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, 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