obiektowe metody projektowania systemów

21
Obiektowe metody projektowania systemów Design Patterns OBSERVER

Upload: keita

Post on 08-Jan-2016

50 views

Category:

Documents


3 download

DESCRIPTION

Obiektowe metody projektowania systemów. Design Patterns OBSERVER. Wstęp: Obserwator (Observer). Wzorzec ma na celu zdefiniowanie zależności miedzy obiektami typu jeden-do-wielu tak, aby przy zmianie stanu jednego pozostałe były o tym powiadamiane i też zmieniały swój stan. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Obiektowe metody projektowania systemów

Obiektowe metody projektowania systemów

Design Patterns

OBSERVER

Page 2: Obiektowe metody projektowania systemów

Wstęp: Obserwator (Observer)

• Wzorzec ma na celu zdefiniowanie zależności miedzy obiektami typu jeden-do-wielu tak, aby przy zmianie stanu jednego pozostałe były o tym powiadamiane i też zmieniały swój stan.•Jest behawioralnym wzorcem projektowym

Przykład1 ideowy:

Page 3: Obiektowe metody projektowania systemów

1. Cel stosowania

2. Przydatność

3. Struktura

4. Diagram Zależności

5. Konsekwencje

6. Przykładowa implementacja

7. Podsumowanie

8. Bibliografia

Plan:

Page 4: Obiektowe metody projektowania systemów

Cel stosowania:

•Wzorzec Observer stosujemy dla części – subject, observer gdy chcemy aby nie pozostawały w ścisłej relacji między sobą tak by mogły pracować niezależnie jak i wspólnie np. tworzymy interfejs graficzny z wieloma prezentacjami tych samych danych.

Ad. Przykład 1. Za działanie prezentacji odpowiada klasa Observer, a udostępnianiem danych i zarządzaniem dołączaniem nowych obiektów typy observer klasa Subject.

•Obiekty typu Observer nic o sobie nie wiedzą.

•Każdy observer jest powiadamiany o zmianie w danych w obiekcie subject.

•W odpowiedzi na powiadomienie o zmianie observer wysyła zapytanie w celu synchronizacji własnych danych z danymi w subject.

Page 5: Obiektowe metody projektowania systemów

Przydatność:

Wzorzec Observer stosujemy w sytuacjach:

•Kiedy zagadnienie ma dwa aspekty wzajemnie od siebie zależne,enakapsulacja tych warunków w oddzielne obiekty pozwala na dowolne ich używanie niezależnie od siebie.

•Kiedy zmiana jednego obiektu wymaga zmiany innych i nie wiemy Ile obiektów wymaga zmiany.

•Kiedy chcemy zmieniać obiekty bez wiedzy jaki obiekt wymaga zmiany

Page 6: Obiektowe metody projektowania systemów

Struktura:

+attach(in o : Observer)+detach(in o : Observer)+notify()

Subject

+update()

Observer

+getState()

-subjectState

ConcreteSubject

+update()

-observerState

ConcreteObserver

1

-observers

*

{observerState = subject.getState() }

{return subjectState }

{for all o in observers{ o.update() } }

-subject

1 *

Page 7: Obiektowe metody projektowania systemów

Diagram zależności:

:ConcreteSubject :ConcreteObserver-1 :ConcreteObserver-2

GetState()

Notify()

Update()

SetState()

GetState()

Update()

Page 8: Obiektowe metody projektowania systemów

Konsekwencje

•Pozwala na utworzenie abstrakcyjnego sprzężenia pomiędzy obiektamiSubject i Observer. Subject nie zna żadnej konkretnej klasy observer.Pozwala to na komunikowanie się między poziomami w systemie. Położony w niższej warstwie subject może notować zmiany położonemuWyżej w hierarchii observerowi.

•Odbiorca informacji nie musi wysyłać zapytania o zmianę w systemie.Powiadomienia o zmianach w systemie są wysyłane automatycznie doDowolniej liczby odbiorców.

•Observery mogą przyjąć informację lub ją odrzucić.

•Może wystąpić niepotrzebna aktualizacja interfejsu.

•Prosty protokół przekazywania informacji nie określa co zostało zmienione.

Page 9: Obiektowe metody projektowania systemów

ImplementacjaWiązanie obiektu Subject z jego observerami:Subject może śledzić observery utrzymując referencje lub tworzącwektor wskaźników do obiektów observer.

Możliwa jest relacja więcej niż jeden obiekt Subiect – ObserverySubject powinien w takim przypadku w interfejsie Update() przesyłać parametr observerom.

Za wywoływanie aktualizacji odpowiedzialny jest Subject.możliwe jest obciążenie observera wywoływaniami aktualizacji.

Skasowany Subjekt lub Observer nie powinien pozostawiać „wiszących” Referencji.

Przed wysłaniem aktualizacji należy sprawdzić spójność Subject aby Observer nie wysłał zapytania GetState w pośrednim stanie Subject.

Page 10: Obiektowe metody projektowania systemów

Implementacja

Możliwe typy aktualizacji:Push model: Subject wysyła szczegółową informacje do ObserveraPoll model: Subject wysyła minimalną ilość informacji o resztę pyta Observer

Observer może być modyfikowany tylko dla określonych zdarzeńCo czyni aktualizację bardziej efektywną.

Enkapsulacja zbioru zachowań aktualizacyjnych:Jeśli Subject i Observer powiązane są wieloma zależnościami, można Stworzyć Chenge Manage`ra do kierowania operacją aktualizacji. Np. wPrzypadku jeśli Wiele obiektów Subject zmienia stan przed aktualizacjąktóregokolwiek z Observerów. Change Manager zarządza zmianami SubjectI aktualizuje sekwencyjnie observery.

Page 11: Obiektowe metody projektowania systemów

Przykładowa implemantacja:

Program prezentujący czas w dwóch formatach: analogowymI cyfrowym. Klasy programu:

Observer Pattern Clock Program

Class name Class Name

Subject Subject

ConcreteSubject ClockTimer

Observer Observer

ConcreteObserver AnalogClock

DigitalClock

Page 12: Obiektowe metody projektowania systemów

Przykładowy kod:

class Subject {

public:

virtual ~Subject();

virtual void Attach(Observer*);

virtual void Detach(Observer*);

virtual void Notify();

protected:

Subject();

private:

List<Observer*> *_observers;

};

Page 13: Obiektowe metody projektowania systemów

void Subject::Attach (Observer* o) {

_observers->Insert(_observers->end(), o);

}

void Subject::Detach (Observer* o) {

_observers->remove(o);

}

void Subject::Notify () {

ListIterator<Observer*>i(_observers);

for (i.First(); !i.IsDone(); i.Next()) {

i.CurrentItem()->Update(this);

}

}

Przykładowy kod:

Page 14: Obiektowe metody projektowania systemów

Przykładowy kod:

class Observer {

public:

virtual ~Observer();

virtual void Update(Subject* theChangeSubject) = 0;

protected:

Observer();

};

Page 15: Obiektowe metody projektowania systemów

Przykładowy kod:

class ClockTimer : public Subject {

public:

ClockTimer();

virtual int GetHour();

virtual int GetMinute();

virtual int GetSecond();

void Tick();

};

void ClockTimer::Tick() {

Notify(); // update internal time-keeping state

}

Page 16: Obiektowe metody projektowania systemów

Przykładowy kod:class DigitalClock: public Observer {

public:

DigitalClock(ClockTimer *);

~DigitalClock();

void Update(Subject *);

void Draw();

private:

ClockTimer *_subject;

};

Page 17: Obiektowe metody projektowania systemów

Przykładowy kod:

DigitalClock::DigitalClock (ClockTimer *s)

{ _subject = s;

_subject->Attach(this);

}

DigitalClock::~DigitalClock ()

{ _subject->Detach(this);

}

void DigitalClock::Update (Subject *theChangedSubject)

{ if(theChangedSubject == _subject)

draw();

}

Page 18: Obiektowe metody projektowania systemów

void DigitalClock::Draw ()

{ int hour = _subject->GetHour();

int minute = _subject->GetMinute();

int second = _subject->GetSecond(); // draw operation

} class AnalogClock: public Observer { public: AnalogClock(ClockTimer *); ~AnalogClock(); void Update(Subject *); void Draw(); private: ClockTimer *_subject; };

Przykładowy kod:

Page 19: Obiektowe metody projektowania systemów

Main Program int main(void) { ClockTimer *timer = new ClockTimer; AnalogClock *analogClock = new AnalogClock(timer); DigitalClock *digitalClock = new DigitalClock(timer);

timer->Tick();

return 0; }

Przykładowy kod:

Page 20: Obiektowe metody projektowania systemów

Podsumowanie:

•Bardzo ważny gang of four wzorzec–Znany także jako model-view and publish-subscribe–Podobieństwa do pattern-ów Mediator i Singleton

–Dobry sposób na rejestrowanie przyszłych

nieoczekiwanych zmian.

Page 21: Obiektowe metody projektowania systemów

Bibliografia:•Gamma E., Helm R., Johnson R., Vlissides R.:Design Patterns: Elements of Reusable Object-Oriented Software•„DESIGN PATTERNS EXPLAINED, new perspective on obiect-oriented design ” – A. Shalloway, J. R. Trott

•http://www.dofactory.com/Patterns/PatternObserver.•http://www.wohnklo.de/patterns/observer.html•http://www.javaworld.com/javaworld/javaqa/2001-05/04-qa-0525-observer.html