„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ó
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ó!
* 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.
* 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.
* 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: '''
Amikor 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 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ó
Amikor egy objektumnak értesítenie kell más objektumokat az értesítendő objektum szerkezetére vonatkozó feltételezések nélkül
* 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
* laza kapcsolat a Subject és az Observer között
Üzenetszórás támogatása
* üzenetszórás támogatása
Hátrányok:
'''Hátrányok'''
Felesleges Update-ek
* 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 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
* ú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
* 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
* 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
* 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
* 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
* 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
* egységbezárja az állapotfüggő viselkedést, így könnyű új állapotok bevezetése
Áttekinthetőbb kód (nincs nagy switch-case szerkezet)
* áttekinthetőbb kód (nincs nagy switch-case szerkezet)
A State objektumokat meg lehet osztani
* a State objektumokat meg lehet osztani
Hátrányok:
'''Hátrányok '''
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  
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.  
-- Estrica - 2008.06.09.
[[Szerkesztő:Kavics|Kavics]] ([[Szerkesztővita:Kavics|vita]]) 2013. január 29., 16:04 (CET) Estrica - 2008.06.09.