„Tervezési minták (Sznikák)” változatai közötti eltérés
Nincs szerkesztési összefoglaló |
Nincs szerkesztési összefoglaló |
||
| 193. sor: | 193. sor: | ||
* 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? | ||
Előnyök | '''Előnyök''' | ||
* a modell kódjában csak egy IView lista van, így a modell független az egyes IView-t implementáló osztályoktól. A modell újrafelhasználható! | |||
* egy egyszerű mechanizmust kaptunk arra, hogy az összes view konzisztens nézetét mutassa az adatoknak. | |||
* a rendszer könnyen kiterjeszthető új view osztályokkal. Sem a modellt, sem a többi view osztályt nem kell ehhez módosítani. | |||
Lehetővé teszi, hogy egy objektum megváltozása esetén értesíteni tudjon tetszőleges más objektumokat anélkül, hogy bármit is tudna róluk. Ez az ún. observer minta lényege | * Lehetővé teszi, hogy egy objektum megváltozása esetén értesíteni tudjon tetszőleges más objektumokat anélkül, hogy bármit is tudna róluk. Ez az ún. observer minta lényege | ||
Struktúra: | '''Struktúra: ''' | ||
Subject: Tárolja a beregisztrált Observer-eket; Interfészt definiál Observer-ek be- és kiregisztrálására valamint értesítésére | * Subject: Tárolja a beregisztrált Observer-eket; Interfészt definiál Observer-ek be- és kiregisztrálására valamint értesítésére | ||
Observer: Interfészt definiál azon objektumok számára, amelyek értesülni szeretnének a Subject-ben bekövetkezett változásról (Update művelet) | * Observer: Interfészt definiál azon objektumok számára, amelyek értesülni szeretnének a Subject-ben bekövetkezett változásról (Update művelet) | ||
ConcreteSubject: Az observer-ek számára érdekes állapotot tárol; Értesíti a beregisztrált observer-eket, amikor az állapota megváltozik | * ConcreteSubject: Az observer-ek számára érdekes állapotot tárol; Értesíti a beregisztrált observer-eket, amikor az állapota megváltozik | ||
ConcreteObserver: Referenciát tárol a megfigyelt ConcreteSubject objektumra; Olyan állapotot tárol, amit a megfigyelt ConcreteSubject állapotával konzisztensen kell tartani; Implemetálja az Observer interfészét (Update művelet), ez az, amit a Subject meghív, amikor a ConcreteSubject állapota megváltozik. Ebben frissíti a saját állapotát a megfigyelt ConcreteSubject? állapotának megfelelően | * ConcreteObserver: Referenciát tárol a megfigyelt ConcreteSubject objektumra; Olyan állapotot tárol, amit a megfigyelt ConcreteSubject állapotával konzisztensen kell tartani; Implemetálja az Observer interfészét (Update művelet), ez az, amit a Subject meghív, amikor a ConcreteSubject állapota megváltozik. Ebben frissíti a saját állapotát a megfigyelt ConcreteSubject? állapotának megfelelően | ||
Használjuk, ha: | '''Használjuk, ha: ''' | ||
* egy objektum megváltoztatása maga után vonja más objektumok megváltoztatását, és nem tudjuk, hogy hány objektumról van szó | |||
* egy objektumnak értesítenie kell más objektumokat az értesítendő objektum szerkezetére vonatkozó feltételezések nélkül | |||
Megjegyzés: az Observer az egyik leggyakrabban használt minta | '''Megjegyzés:''' az Observer az egyik leggyakrabban használt minta | ||
Előnyök | '''Előnyök ''' | ||
* laza kapcsolat a Subject és az Observer között | |||
* üzenetszórás támogatása | |||
Hátrányok | '''Hátrányok''' | ||
* felesleges Update-ek | |||
* 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 | ||
Használjuk, ha | '''Használjuk, ha ''' | ||
* úgy szeretnénk hozzáférni egy objektum tartalmazott objektumaihoz, hogy nem akarjuk felfedni a bels� m�ködését | |||
* többféle hozzáférést szeretnénk biztosítani a tartalmazott objektumokhoz | |||
* egy időben több, egymástól független hozzáférést szeretnénk a lista elemeihez | |||
* 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 | ||
Használjuk ha | '''Használjuk ha''' | ||
* az objektum viselkedése függ az állapotától, és a viselkedését az aktuális állapotnak megfelel�en futás közben meg kell változtatnia | |||
* a műveleteknek nagy feltételes ágai vannak, melyek az objektum állapotától függenek | |||
Előnyök | '''Előnyök''' | ||
* egységbezárja az állapotfüggő viselkedést, így könnyű új állapotok bevezetése | |||
* áttekinthetőbb kód (nincs nagy switch-case szerkezet) | |||
* a State objektumokat meg lehet osztani | |||
Hátrányok | '''Hátrányok ''' | ||
* 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 | ||
Szerkezet: | '''Szerkezet: ''' | ||
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. | ||
[[Szerkesztő:Kavics|Kavics]] ([[Szerkesztővita:Kavics|vita]]) 2013. január 29., 16:04 (CET) Estrica - 2008.06.09. | |||