„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ó
161. sor: 161. sor:
* 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 ==
Cél: Egy kérés objektumként való egységbezárása. Ez lehetővé teszi a kliens különböző kérésekkel való felparaméterezését, a kérések sorba állítását, naplózását és visszavonását (undo)
'''Cél:''' Egy kérés objektumként való egységbezárása. Ez lehetővé teszi a kliens különböző kérésekkel való felparaméterezését, a kérések sorba állítását, naplózását és visszavonását (undo)
Nagyon rendszerfüggő (C++, .NET, stb.) a koncepció és az implementáció is
Nagyon rendszerfüggő (C++, .NET, stb.) a koncepció és az implementáció is
Példa: felhasználói parancsok
'''Példa:''' felhasználói parancsok
Használjuk, ha  
'''Használjuk, ha '''
Ha strukturált programban callback függvényt használnánk, OO programban használjunk commandot helyette.
* a strukturált programban callback függvényt használnánk, OO programban használjunk commandot helyette.
Szeretnénk a kéréseket különböző időben kiszolgálni. Ilyenkor várakozási sort használunk, a command-ban tároljuk a paramétereket, majd akár különböző folyamatokból/szálakból is feldolgozhatjuk őket.
* szeretnénk a kéréseket különböző időben kiszolgálni. Ilyenkor várakozási sort használunk, a command-ban tároljuk a paramétereket, majd akár különböző folyamatokból/szálakból is feldolgozhatjuk őket.
Visszavonás támogatására – eltároljuk az előző állapotot a command-ban
* visszavonás támogatására – eltároljuk az előző állapotot a command-ban
Előny:
'''Előny '''
Elválasztja a parancsot kiadó objektumot attól, amelyik tudja, hogyan kell lekezelni
* elválasztja a parancsot kiadó objektumot attól, amelyik tudja, hogyan kell lekezelni
Kiterjeszthetővé teszi a Command specializálásával a parancs kezelését
* kiterjeszthetővé teszi a Command specializálásával a parancs kezelését
Összetett parancsok támogatása
* összetett parancsok támogatása
Egy parancs több GUI elemhez is hozzárendelhető: tipikusan menüelem és toolbar gomb
* egy parancs több GUI elemhez is hozzárendelhető: tipikusan menüelem és toolbar gomb
Könnyű hozzáadni új parancsokat, mert ehhez egyetlen létező osztályt sem kell változtatni.
* könnyű hozzáadni új parancsokat, mert ehhez egyetlen létező osztályt sem kell változtatni.
Memento
== Memento ==
Cél: Az egységbezárás megsértése nélkül a külvilág számára elérhetővé tenni az objektum bels� állapotát. Így az objektum állapota később visszaállítható.
'''Cél:''' Az egységbezárás megsértése nélkül a külvilág számára elérhetővé tenni az objektum belső állapotát. Így az objektum állapota később visszaállítható.
Példa: Visszavonás (undo) funkció a Dokumentumban
'''Példa: '''Visszavonás (undo) funkció a Dokumentumban
Struktúra:
'''Struktúra '''
Originator: az állapotát kell tudni visszaállítani.
* Originator: az állapotát kell tudni visszaállítani.
A CreateMemento() elment (pontosabban visszaadja a state állapotot egy Memento objektum formájában)
** A CreateMemento() elment (pontosabban visszaadja a state állapotot egy Memento objektum formájában)
A SetMemento() visszaállít, (pontosabban beállítja a state állapotot a paraméterben megkapott Memento objektum alapján)
** A SetMemento() visszaállít, (pontosabban beállítja a state állapotot a paraméterben megkapott Memento objektum alapján)
Memento: az Originator állapotát tárolja és elméletileg csak az Originator számára biztosít hozzáférést az állapothoz (state). Pl. C++-ban a friend alkalmazásával oldható ez meg.
* Memento: az Originator állapotát tárolja és elméletileg csak az Originator számára biztosít hozzáférést az állapothoz (state). Pl. C++-ban a friend alkalmazásával oldható ez meg.
CareTaker: nyilvántartja a Mementokat
* CareTaker: nyilvántartja a Mementokat
Használjuk, ha  
'''Használjuk, ha '''
Egy objektum (rész)állapotát kés�bb vissza kell állítani és egy közvetlen interfész az objektum állapotához használná az implementációs részleteket, vagyis megsértené az objektum egységbezárását
* egy objektum (rész)állapotát később vissza kell állítani és egy közvetlen interfész az objektum állapotához használná az implementációs részleteket, vagyis megsértené az objektum egységbezárását
Előnyök:
'''Előnyök '''
Megőrzi az egységbezárás határait
* megőrzi az egységbezárás határait
Egyszerűsíti az Originatort
* egyszerűsíti az Originatort
Hátrányok:
'''Hátrányok '''
Memento használata sokszor erőforrásigényes
* Memento használata sokszor erőforrásigényes
Nem mindig jósolható meg a Caretaker által lefoglalt hely, és ez sok is lehet
* nem mindig jósolható meg a Caretaker által lefoglalt hely, és ez sok is lehet
Observer
== Observer ==
Cél: Hogyan tudják objektumok értesíteni egymást állapotuk megváltozásáról anélkül, hogy függőség lenne a konkrét osztályaiktól
Cél: Hogyan tudják objektumok értesíteni egymást állapotuk megváltozásáról anélkül, hogy függőség lenne a konkrét osztályaiktól
Példa: MVC vagy Document-View architektúra - A felhasználó megváltoztatja az egyik nézeten az adatokat, hogyan frissítsük a többit?
Példa: MVC vagy Document-View architektúra - A felhasználó megváltoztatja az egyik nézeten az adatokat, hogyan frissítsük a többit?
216. sor: 216. sor:
Az egyszerű Update alapján az Subject összes adatát le kell kérdezni (bár a Subject az Object::Update meghívásakor megadhatja paraméterként, hogy mi változott meg).
Az egyszerű Update alapján az Subject összes adatát le kell kérdezni (bár a Subject az Object::Update meghívásakor megadhatja paraméterként, hogy mi változott meg).
Az előbbi modellben a Subject ::Notifyt meghívó Observer-re is meghívódik az Update, holott az változtatta meg a ConcreteSubject állapotát
Az előbbi modellben a Subject ::Notifyt meghívó Observer-re is meghívódik az Update, holott az változtatta meg a ConcreteSubject állapotát
Iterator
== Iterator ==
Cél: Szekvenciális hozzáférést biztosít egy összetett (pl. lista) objektum elemeihez anélkül, hogy annak belső reprezentációját felfedné
Cél: Szekvenciális hozzáférést biztosít egy összetett (pl. lista) objektum elemeihez anélkül, hogy annak belső reprezentációját felfedné
Példa: Lista
Példa: Lista
224. sor: 224. sor:
Egy időben több, egymástól független hozzáférést szeretnénk a lista elemeihez
Egy időben több, egymástól független hozzáférést szeretnénk a lista elemeihez
Ha különböző tartalmazott struktúrákhoz szeretnénk hozzáférni hasonló interfésszel
Ha különböző tartalmazott struktúrákhoz szeretnénk hozzáférni hasonló interfésszel
State
== State ==
Cél: Lehetővé teszi egy objektum viselkedésének megváltozását, amikor megváltozik az állapota.
Cél: Lehetővé teszi egy objektum viselkedésének megváltozását, amikor megváltozik az állapota.
Példa: TCPConnection osztály egy hálózati kapcsolatot reprezentál; Három állapota lehet: Listening, Established, Closed; A kéréseket az állapotától függően kezeli
Példa: TCPConnection osztály egy hálózati kapcsolatot reprezentál; Három állapota lehet: Listening, Established, Closed; A kéréseket az állapotától függően kezeli
236. sor: 236. sor:
Hátrányok:  
Hátrányok:  
Nő az osztályok száma (csak indokolt esetben használjuk)
Nő az osztályok száma (csak indokolt esetben használjuk)
Mediator
== Mediator ==
Cél: Olyan objektumot definiál, ami egységbe zárja, hogy objektumok egy csoportja hogyan éri el egymást (hogyan kommunikál egymással). Megoldja, hogy az egymással kommunikáló objektumoknak ne kelljen egymásra hivatkozást tárolniuk, ezáltal biztosítja az objektumok laza csatolását.  
Cél: Olyan objektumot definiál, ami egységbe zárja, hogy objektumok egy csoportja hogyan éri el egymást (hogyan kommunikál egymással). Megoldja, hogy az egymással kommunikáló objektumoknak ne kelljen egymásra hivatkozást tárolniuk, ezáltal biztosítja az objektumok laza csatolását.  
Példa: Egy Form vagy dialógus ablak  
Példa: Egy Form vagy dialógus ablak  
242. sor: 242. sor:
Minden vezérlőelem tartalmaz egy referenciát a dialógus ablakra (mediátor)
Minden vezérlőelem tartalmaz egy referenciát a dialógus ablakra (mediátor)
A dialógus ablak minden vezérlőelemre tartalmaz egy referenciát
A dialógus ablak minden vezérlőelemre tartalmaz egy referenciát
Strategy
== Strategy ==
Cél: Algoritmusok egy csoportján belül az egyes algoritmusok egységbe zárása és egymással kicserélhetővé tétele. A kliens szemszögéből az általa használt algoritmusok szabadon kicserélhetőek.  
Cél: Algoritmusok egy csoportján belül az egyes algoritmusok egységbe zárása és egymással kicserélhetővé tétele. A kliens szemszögéből az általa használt algoritmusok szabadon kicserélhetőek.  
Példa: A kliens objektum különféle sorrendező algoritmusokat használhat; A kliens tartalmaz egy SortAlgorithm típusú pointert/referenciát egy konkrét (QuickSort v. HeapSort) objektumra.  
Példa: A kliens objektum különféle sorrendező algoritmusokat használhat; A kliens tartalmaz egy SortAlgorithm típusú pointert/referenciát egy konkrét (QuickSort v. HeapSort) objektumra.  
-- Estrica - 2008.06.09.
-- Estrica - 2008.06.09.