You are on page 1of 37

Viselkedési minták

Viselkedési minták

Krizsán Zoltán1
[2012. április 2.]

Általános Informatikai Tanszék


Miskolci Egyetem

2012. április 2.
Viselkedési minták

1 Viselkedési minták
Parancs (Command)
Meggyel® (Observer)
Felel®ség lánc (Chain of responsibility)
Közvetít® (Mediator)
Viselkedési minták

Tartalom

1 Viselkedési minták
Parancs (Command)
Meggyel® (Observer)
Felel®ség lánc (Chain of responsibility)
Közvetít® (Mediator)
Viselkedési minták

Cél

Kérelmek objektumba ágyazása . Ezáltal a klienseknek


különböz® parancsokat adhatunk át, amit naplózhatunk, sorba
rendezhetünk és a visszavonást (undo) kezelhetjük le. Azaz az
egyes kérelmek teljesen kivizsgálhatóak és hatálytalaníthatóak
lesznek. Mivel objektumba vannak ágyazva a kérelmek így
lehet®ség van a kérések ideiglenes tárolására.
Viselkedési minták

Motiváció

Néha muszáj, hogy kéréseket küldjünk egyes objektumokhoz úgy,


hogy bármi ismeretünk lenne a kért folyamatról vagy a kérést
fogadóról. A felhasználói felületek programozására gyakran használt
könyvtárak, eszközkészletek többek között olyan objektumokat
menüket és gombokat tartalmazhatnak, amelyek egy felhasználói
esemény hatására indítanak el valamilyen m¶veleteket. Konkrét
implementációt a menü, vagy a gomb objektumok nem képesek
megvalósítani, mert csakis az eszközkészleteket használó alkalmazás
tudja, mi mit csinál ilyenkor. Az eszközkészlet tervez®i nem tudják
el®re, hogy a konkrét tevékenységet végül milyen objektum és
hogyan hajtja végre. A Parancs (Command) mintával ezen kérések
az elemkészlet objektumok számára megvalósíthatóvá válik oly
módon, hogy a kéréseket is objektumként kezelik.
Viselkedési minták

Alkalmazhatóság

Commit támogatás
A m¶veletek ismét végrehajtásának támogatása

Undo támogatás
A m¶veletek visszavonásának támogatása Unexecute m¶velet
szükséges hozzá Wizard-ok Swing Progress bar

Naplózás
Változások naplózása rendszerösszeomlás, helyreállítás esetén.
Viselkedési minták

Felépítés

<<Interface>>
Invoker mCommand Command
0..1 +execute()

Client Receiver ConcrateCommand


+action() 0..1 +execute()
Viselkedési minták

Résztvev®k

Parancs felület (Command) Létrehoz egy interfészt egy m¶velethez.


KonkrétParancs osztály (ConcreteCommand) Egymáshoz rendeli Fogadó
osztályt és egy végrehajtandó m¶veletet. Fogadó osztály
megfelel® m¶veletének hívásával implementálja a
Végrehajt m¶veletet. Undo megvalósítása esetén
KonkrétParancs osztály állapotát is tárolni kell.
Ügyfél osztály (Client) Létrehoz egy KonkrétParancs osztályt és beállítja
annak Fogadó osztályát.
Hívó osztály (Invoker) Felkéri a Parancs felületet a kérelem teljesítésére
úgy, hogy meghívja annak Execute() metódusát.
Fogadó osztály (Receiver) A kérést fogadja, birtokában van az adott
kérelemhez kapcsolódó m¶veletek végrehajtásához
szükséges tudásnak. Bármelyik osztály lehet fogadó.
Viselkedési minták

Együttm¶ködés

Az Ügyfél osztály (Client) létrehoz egy KonkrétParancs osztályt és


meghatározza annak fogadóját. Valamelyik Hívó osztály
elraktározza a KonkrétParancs osztályt. A Hívó osztály kérelmet
bocsát ki. A KonkrétParancs osztály m¶veleteket hív meg a
fogadóján.
Viselkedési minták

Kévetkezmény
El®nyök
A Parancs(Command) minta alkalmazása feloldja a
kapcsolatot a m¶veletet kezdeményez® és az azt végrehajtó
objektumok között.
A parancs objektumok is ugyanúgy használhatók és
kib®víthet®k, tipikus objektumok.
A parancsok összetett parancsokká rendezhet®k, mint például
makrót képezve.
Parancsot osztálymódosítás nélkül vehetünk fel.
Lehet®vé teszi a párhuzamos feldolgozást.

Hátrányok
Sok kis osztályt kell írni.
Sok kis objektum keletkezik.
Viselkedési minták

Tartalom

1 Viselkedési minták
Parancs (Command)
Meggyel® (Observer)
Felel®ség lánc (Chain of responsibility)
Közvetít® (Mediator)
Viselkedési minták

Cél

Objektumok közötti egy-több függ®ségi kapcsolat létrehozása. Egy


kiválasztott objektum módosulásáról értesít® információt küldeni a
t®le függ® objektumoknak, amik ezek alapján frissülnek.
Viselkedési minták

Motiváció
Modell-Nézet-Vezérl® (MVC) vagy Document-View architektúránál
gyakran el®fordul, hogy a felhasználó megváltoztatja az egyik
nézeten az adatokat, ezeket a többi nézeten is frissíteni kell,
következetességet fent kell tartani. Egy táblázatkezel® különböz®
adatmegjelenítéseket használ, megjelenítheti táblázatként és
diagramként is az információt. A két megjelenítési objektum nem
tud egymásról elég nekik a szükséges objektumok újrahasznosítását
elvégezni. Ha felhasználó módosít egy adatot a táblázatban, akkor
ezzel egy id®ben a diagram is módosul és fordítva is.
Ezt nem célszer¶ szoros kötéssel megoldani, mert akkor csökken az
osztályok újra felhasználásának lehet®ségeinek száma. Erre jó
megoldást nyújt a Meggyel® (Observer) minta. Megadja a
szükséges kapcsolatok megvalósításának módját. F®objektumai az
Alany (Subject) és a Meggyel® felület (Observer), közöttük 1-több
kapcsolat áll fent.
Viselkedési minták

Alkalmazhatóság

Olyan esetekben, amikor egy fogalomhoz két olyan interfésszel


rendelkez® objektum tartozik, hogy az egyik függ a másiktól.
Amennyiben külön objektumba zárjuk ezeket a jelentéseket,
úgy egymástól függetlenül módosíthatjuk, vagy
hasznosíthatjuk újra ®ket.
Amikor egy objektum megváltoztatása további objektumokon
való operációt vonja maga után, viszont ezen további
objektumok száma ismeretlen számunkra.
Amikor változásokról kell értesíteni más objektumokat,
azonban nincs ismeretünk arról, melyek ezek az objektumok.
Viselkedési minták

Felépítés

mObservers
<<Interface>> <<Interface>>
Subject Observer
+regiterObserver() +update()
+unregisterObserver()
-notifyObservers()

ConcreateSubject ConcreateObserver1 ConcreateObserver2


+update() +update()
Viselkedési minták

Résztvev®k

Alany (Subject) Tárolja a Meggyel®ket. Interfészt biztosít a Meggyel®


objektumok csatolására és leválasztására.
Meggyel® felület (Observer) Frissít® interfészt határoz meg az
értesítend® objektumok számára. Frissít® (update)
m¶velet.
KonkrétAlany osztály (ConcreteSubject) Érdekes állapotokat tárol a
Meggyel® felület számára és saját állapotváltozásairól
értesíti ®ket.
Viselkedési minták

Együttm¶ködés

1 Az Alany (Subject) értesíti a Meggyel® felületet, az olyan


változásokról, ami különböz® állapotot eredményez, mint a
sajátja.
2 Miután értesül az Alanyban bekövetkez® módosulásokról +
információkat kérhet, és összehangolhatja m¶ködését.
Viselkedési minták

Kévetkezmény
El®nyök
Laza kapcsolat van az Alany és Meggyel® között, azaz az
Alanynak tudomása van a Meggyel®kr®l, de pontos
információja nincs róla.
Üzenetszórás támogatás, értesítésnek nem kötelez® deniálnia
a fogadóját.
A modell újrafelhasználható!
Új osztályokkal egyszer¶en b®víthet® a struktúra a modell és
nézet osztály módosítása nélkül.
Az Alany (Subject) objektum változáskor informál több más
objektumot úgy, hogy lenne róluk bár mi információja is.

Hátrány
El®fordulhatnak szükségtelen, váratlan frissítések a nem
precízen deniált függ®ségi feltételek következtében.
Viselkedési minták

Tartalom

1 Viselkedési minták
Parancs (Command)
Meggyel® (Observer)
Felel®ség lánc (Chain of responsibility)
Közvetít® (Mediator)
Viselkedési minták

Cél

Az üzenet vagy kérés küld®jének függetlenítése a fogadótól.


Megvalósítása felel®sségláncok kialakításával történik. A
Felel®sséglánc (Chain of Responsibility) nem más, mint láncolt
lista, amin a kérelem végig halad mindaddig, amíg egy objektum le
nem tudja kezelni. A kérelem a láncon meg is szakítható.
Viselkedési minták

Motiváció
Vegyünk egy grakus felhasználói felület, amihez környezett®l
függ® help rendszert akarunk csinálni.
A felhasználó a felület bármely részére kattint, kapjon

help információt. Valamilyet, lehet®leg minél

speciálisabbat.

A help nem csak attól függ, hogy a felhasználó a felület mely


részére kattint, hanem a kiválasztott felületelem környezetét®l
is.
Nem csak a mögöttes funkció, hanem az is számít, hogy
melyik elemen van. Az funkcionális utóhatások megegyeznek,
de a GUI frissítése más.
Ami a gondot okozza, hogy a kiszolgáló objektum, ami
kiszolgálja a help kérést nem mindenképpen ismert a kérést
elindító objektum számára (nyomó gomb).
Viselkedési minták

Alkalmazhatóság

Mikor egynél több objektum kezelhet le egy igényt


az igényt lekezel® eleve nem ismert,
automatikusan kell kiválasztani, hogy melyik objektum az.
Igényünket objektumok együttesének egy objektumnak akarjuk
címezni, a fogadó objektum pontos deniálása nélkül. Igényt
megvalósító objektumok csoportja dinamikusan választható ki.
A lánc bármely eleme megszakíthatja a kérés kiszolgálást.
Lánc elemei lehetnek egy fa struktúra elemei.
Viselkedési minták

Felépítés

-nextHandler

<<Interface>>
Client Handler
+handle()

ConcreatHandler1 ConcreatHandler3
+handle() +handle()

ConcreatHandler2
+handle()
Viselkedési minták

Résztvev®k

Kezel® (Handler) a kérések kezeléséhez deniál egy interfészt.


Implementálhatja (Opcionálisan) a következ® egyedhez a
kapcsolatot is.
KonkrétKezel®(ConcreteHandler) Lekezeli azokat a kéréseket, melyekért
® a felel®s. Hozzáférhet a láncban az utána következ®
elemhez. A hozzáérkez® kérést vagy lekezeli, ha le tudja,
egyébként pedig a láncban továbbítja.
Ügyfél (Client) Egy KonkrétKezel® (ConcreteHandler) objektumhoz intéz
kérést, ezzel elindítva a kérelmét a láncban.
Viselkedési minták

Együttm¶ködés

El®ször felépítik a kezel®kb®l a felel®sség láncot. Minden elem


(láncszem tudja a feladatát, hogy miért felel®s, mit tud kezelni. Ha
a láncban elindul egy kérés az addig halad a láncon belül, míg egy
olyan KonkrétKezel® (ConcreteHandler) objektumhoz nem ér,
aminek hatáskörébe tartozik az adott kérés lekezelése.
Viselkedési minták

Következmény
Szervlet sz¶r® is ezt használja: javax.servlet.Filter#doFilter(),
FilterChain
El®nyök
A kérést küld® objektum nem ismeri a kiszolgáló
objektumokat. Még a számát sem.
A kérést feldolgozó sem ismeri a küld®t, csak a következ®t.
Egyszer¶ szerkezet, csak a következ® elemet ismerik.
Rugalmas, futás id®ben is módosítható.

Hátrányok
A kérések nem egy konkrét objektumhoz fut be, ezért nem
garantált, hogy kiszolgálják. (Bár lehet végigfut a láncon, de
senki nem vállalja el.)
Lehet, hogy rosszul kongurálják.
Viselkedési minták

Feladat I

Készítsünk egy dialógus alapú grakus alkalmazást melyben 3


gomb (Betöltés, Mentés, Kilépés) található, és két check box
(automatikus, manuális)!
Attól függ®en, hogy melyik elem van kiválasztva, jelenítsünk
meg help információt!
A Kilépés gomb kivételével minden elemhez legyen segítség
információ, a dialógus ablakhoz is!
Alakítsuk ki a következ® felel®ség láncot: Betöltés -> Mentés
-> Összes gomb -> Form -> Alkalmazás
Az általános Handle osztályba kell egy SetNextHandle
metódus!
Viselkedési minták

Tartalom

1 Viselkedési minták
Parancs (Command)
Meggyel® (Observer)
Felel®ség lánc (Chain of responsibility)
Közvetít® (Mediator)
Viselkedési minták

Cél

A minta célja deniálni egy olyan közvetít® (mediator) objektumot,


ami egymásra ható objektumhalmazok közötti interakciók
irányítását végzi. Segítségével laza kapcsolat építhet® fel azáltal,
hogy az objektumok között nem történik egymásra való direkt
hivatkozás. Ez lehet®séget ad az objektumok közötti kapcsolatok
független alakítására.
Viselkedési minták

Motiváció

Az objektum orientált tervezés a viselkedések objektumok


közötti szétosztására biztat.
eredményeképpen bonyolult, rengeteg kapcsolatot tartalmazó
objektum szerkezet alakulhat ki
Ha egy rendszert objektumokra bontunk fel az általában
fokozza az újra felhasználhatóságot, viszont ha túl sok az
objektumok közötti kapcsolat az már csökkenti azt.
Önállóan már nem lehet használni az objektumot.
a rendszer viselkedésének módosítása is bonyolult lesz
bármilyen úton, mivel a viselkedés számos objektum között van
elosztva.
Viselkedési minták

Alkalmazhatóság

Akkor érdemes használni, ha olyan objektum halmazunk van


egyértelm¶en meghatározott
egymással összetett módon kommunikálnak
szervezetlen
nehezen érthet® struktúra
A lánc bármely eleme megszakíthatja a kérés kiszolgálást.
Lánc elemei lehetnek egy fa struktúra elemei.
Viselkedési minták

Felépítés

Colleague1

<<Interface>>
Mediator mediator

Colleague2
mediator
ConcreateMeditor1

ConcreateMeditor2
Viselkedési minták

Résztvev®k

Közvetít® (Mediator) A Kolléga (Colleague) elemhez deniál egy


kommunikációs interfészt.
KonkrétKözvetít® (Concrete Mediator) Az együttm¶köd® objektumokat
irányítja. Társairól tud és ezekkel a kollégákkal
kapcsolatot tart fent.
Kolléga (Colleague) osztályok Minden Kolléga (Colleague) elemnek csak
a Közvetít®jér®l (Mediator) van tudomása. A Közvetít®
(Mediator) elemnek központi elosztó szerepe van, ezen
keresztül fut át minden interakció, kérés a Kollégák
(Colleague) között.
Viselkedési minták

Együttm¶ködés

A Kolléga (Colleague) elemek a Közvetít®nek (Mediator) küldik a


kéréseiket és az arra kapott válaszokat is t®le fogadják.
Viselkedési minták

Következmény

A közvetít® minta segítségével laza kapcsolat alakítható ki az


objektumok között, ami lehet®séget ad arra, hogy a Kolléga
(Colleague) és a Közvetít® (Mediator) elemeket egymástól
függetlenül is felhasználhassuk vagy alakítsuk.
Közvetít® a több-több kapcsolatok helyett a közvetít® és
kollégák közötti egy-több kapcsolatokat teremt, melyek
könnyebben érthet®ek, kezelhet®ek és kiterjeszthet®ek.
A vezérlés központosítása
Viselkedési minták

Feladat I
Készítsünk egy dialógus alapú grakus alkalmazást melyben
egy varoslita lista ablak található a lehetséges elemekkel
(Városok nevei),
beviteli mez®,
másik kivalasztottVarosok lista a felvett városok neveivel,
hozzáad gomb,
töröl gomb
A következ® képen m¶ködjön:
Ha a varoslista lista egy eleme ki van választva, akkor
másoljuk be a szöveg tartalmát a beviteli mez®be,

engedélyezzük a hozzáad gombot

Az átmásolt szöveget a felhasználó át tudja írni.


Ha a hozzád gombot megnyomtuk, akkor
a szöveges mez® tartalmát hozzáadja a kivalasztottVarosok

városok listájába.

a tötöl gomb engedélyezett lesz.


Viselkedési minták

Feladat II

Ha a töröl gombot megnyomtuk, akkor


a kivalasztottVarosok lista törl®dik,

a töröl gomb tiltódik,

a hozzáad gomb tiltódik

You might also like