„Tervezési minták (Sznikák)” változatai közötti eltérés
Nincs szerkesztési összefoglaló |
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 ''' | ||
* 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. | |||
* 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 | |||
* kiterjeszthetővé teszi a Command specializálásával a parancs kezelését | |||
* összetett parancsok támogatása | |||
* 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. | |||
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 | '''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 | |||
Előnyök | '''Előnyök ''' | ||
* megőrzi az egységbezárás határait | |||
* 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 | |||
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. | ||