„Tervezési minták (Sznikák)” változatai közötti eltérés
aNincs szerkesztési összefoglaló |
|||
| (3 közbenső módosítás, amit 2 másik szerkesztő végzett, nincs mutatva) | |||
| 1. sor: | 1. sor: | ||
{{RightTOC}} | {{RightTOC}} | ||
== Főbb kategóriák == | |||
=== Creational === | === Creational === | ||
* '''Factory method''': a leszármazottra bízza az objektum létrehozását | * '''Factory method''': a leszármazottra bízza az objektum létrehozását | ||
| 21. sor: | 20. sor: | ||
* '''Command''' | * '''Command''' | ||
== Részletes leírás == | |||
== Factory method == | === Factory method === | ||
'''Célja:''' A Factory Method lehetővé teszi, hogy az új példány létrehozását a leszármazott osztályra bízzuk. Szokás virtuális konstruktornak is nevezni. | '''Célja:''' A Factory Method lehetővé teszi, hogy az új példány létrehozását a leszármazott osztályra bízzuk. Szokás virtuális konstruktornak is nevezni. | ||
| 32. sor: | 31. sor: | ||
* Ha egy osztály azt szeretné, hogy leszármazottai határozzák meg azt az objektumot, amit létre kell hoznia | * Ha egy osztály azt szeretné, hogy leszármazottai határozzák meg azt az objektumot, amit létre kell hoznia | ||
== Abstract factory == | === Abstract factory === | ||
'''Példa:''' Ablakos rendszerek, GUI vezérlőelemek (ablak, nyomógomb, kiválasztógomb, stb.) | '''Példa:''' Ablakos rendszerek, GUI vezérlőelemek (ablak, nyomógomb, kiválasztógomb, stb.) | ||
| 49. sor: | 48. sor: | ||
* Megjegyzés: ezt bizonyos esetekben ki lehet kerülni | * Megjegyzés: ezt bizonyos esetekben ki lehet kerülni | ||
== Singleton == | === Singleton === | ||
'''Célja:''' Biztosítja, hogy egy osztályból csak egy példányt lehessen létrehozni, és ehhez az egy példányhoz globális hozzáférést biztosít. | '''Célja:''' Biztosítja, hogy egy osztályból csak egy példányt lehessen létrehozni, és ehhez az egy példányhoz globális hozzáférést biztosít. | ||
| 65. sor: | 64. sor: | ||
'''Kód (C#):''' | '''Kód (C#):''' | ||
public class Singleton{ | public class Singleton{ | ||
private static Singleton instance = null; | private static Singleton instance = null; | ||
public static Singleton Instance{ | public static Singleton Instance{ | ||
get{ | get{ | ||
| 76. sor: | 75. sor: | ||
} | } | ||
} | } | ||
protected Singleton() { } | protected Singleton() { } | ||
public void Print() {...} | public void Print() {...} | ||
} | } | ||
Használata: | Használata: | ||
Singleton s1 = Singleton.Instance; | Singleton s1 = Singleton.Instance; | ||
Singleton.Instance.Print() | Singleton.Instance.Print() | ||
== Prototype == | === Prototype === | ||
'''Célja:''' a prototípus alapján új objektumpéldányok készítése | '''Célja:''' a prototípus alapján új objektumpéldányok készítése | ||
| 107. sor: | 106. sor: | ||
* Minden egyes prototípusnak implementálnia kell a Clone() függvényt, ami igen bonyolult lehet | * Minden egyes prototípusnak implementálnia kell a Clone() függvényt, ami igen bonyolult lehet | ||
== Adapter == | === Adapter === | ||
'''Cél:''' Egy osztály interfészét olyan interfésszé konvertálja, amit a kliens vár. Lehetővé teszi olyan osztályok együttműködését, melyek egyébként az inkompatibilis interfészeik miatt nem tudnának együttműködni. | '''Cél:''' Egy osztály interfészét olyan interfésszé konvertálja, amit a kliens vár. Lehetővé teszi olyan osztályok együttműködését, melyek egyébként az inkompatibilis interfészeik miatt nem tudnának együttműködni. | ||
| 122. sor: | 121. sor: | ||
* egy olyan osztályt szeretnénk használni, amelynek interfésze nem megfelelő Adapter | * egy olyan osztályt szeretnénk használni, amelynek interfésze nem megfelelő Adapter | ||
* egy újrafelhasználható osztályt szeretnénk készíteni, amely együttműködik előre nem látható vagy független szerkezetű osztályokkal (pluggable adapters) | * egy újrafelhasználható osztályt szeretnénk készíteni, amely együttműködik előre nem látható vagy független szerkezetű osztályokkal (pluggable adapters) | ||
== Bridge == | === Bridge === | ||
'''Cél:''' Különválasztja az absztrakciót (interfészt) az implementációtól, hogy egymástól függetlenül lehessen őket változtatni | '''Cél:''' Különválasztja az absztrakciót (interfészt) az implementációtól, hogy egymástól függetlenül lehessen őket változtatni | ||
| 134. sor: | 133. sor: | ||
* ugyanaz az implementációs objektum, több helyen is felhasználható | * ugyanaz az implementációs objektum, több helyen is felhasználható | ||
== Composite == | === Composite === | ||
'''Célja:''' Rész-egész viszonyban álló objektumokat fastruktúrába rendezi. A kliensek számára lehetővé teszi, hogy az egyszerű és kompozit objektumokat egységesen kezelje. | '''Célja:''' Rész-egész viszonyban álló objektumokat fastruktúrába rendezi. A kliensek számára lehetővé teszi, hogy az egyszerű és kompozit objektumokat egységesen kezelje. | ||
| 143. sor: | 142. sor: | ||
* 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. | ||
| 160. sor: | 159. sor: | ||
* 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. | ||
| 173. sor: | 173. sor: | ||
* 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 | ||
| 186. sor: | 187. sor: | ||
* 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 | * 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. | ||
| 196. sor: | 198. 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 | ||
| 213. sor: | 216. sor: | ||
* 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ó. | ||
| 235. sor: | 239. sor: | ||
* 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 | ||
| 266. sor: | 271. 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é | ||
| 277. sor: | 283. sor: | ||
* különböző tartalmazott struktúrákhoz szeretnénk hozzáférni hasonló interfésszel | * 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. | ||
| 294. sor: | 300. sor: | ||
* 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. | ||
| 302. sor: | 308. 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. | ||
[[Category:Infoalap]] | |||