• Nie Znaleziono Wyników

OBSERVER Obiektowe metody projektowania systemów

N/A
N/A
Protected

Academic year: 2021

Share "OBSERVER Obiektowe metody projektowania systemów"

Copied!
21
0
0

Pełen tekst

(1)

Obiektowe metody projektowania systemów

Design Patterns

OBSERVER

(2)

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ład 1

ideowy:

(3)

1. Cel stosowania 2. Przydatność 3. Struktura

4. Diagram Zależności 5. Konsekwencje

6. Przykładowa implementacja 7. Podsumowanie

8. Bibliografia

Plan:

(4)

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.

(5)

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

(6)

Struktura:

(7)

Diagram zależności:

:

ConcreteSubject :ConcreteObserver-1 :ConcreteObserver-2

GetState() Notify()

Update()

SetState()

GetState() Update()

(8)

Konsekwencje

•Pozwala na utworzenie abstrakcyjnego sprzężenia pomiędzy obiektami Subject 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żonemu Wyżej w hierarchii observerowi.

•Odbiorca informacji nie musi wysyłać zapytania o zmianę w systemie.

Powiadomienia o zmianach w systemie są wysyłane automatycznie do Dowolniej 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.

(9)

Implementacja

Wiązanie obiektu Subject z jego observerami:

Subject może śledzić observery utrzymując referencje lub tworząc wektor wskaźników do obiektów observer.

Możliwa jest relacja więcej niż jeden obiekt Subiect – Observery Subject 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.

(10)

Implementacja

Możliwe typy aktualizacji:

Push model: Subject wysyła szczegółową informacje do Observera

Poll 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. w Przypadku jeśli Wiele obiektów Subject zmienia stan przed aktualizacją

któregokolwiek z Observerów. Change Manager zarządza zmianami Subject I aktualizuje sekwencyjnie observery.

(11)

Przykładowa implemantacja:

Program prezentujący czas w dwóch formatach: analogowym I cyfrowym.

Klasy programu:

Observer Pattern Clock Program

Class name Class Name

Subject Subject

ConcreteSubject ClockTimer

Observer Observer

ConcreteObserver AnalogClock

(12)

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;

};

(13)

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:

(14)

Przykładowy kod:

class Observer { public:

virtual ~Observer();

virtual void Update(Subject* theChangeSubject) = 0;

protected:

Observer();

};

(15)

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 }

(16)

Przykładowy kod:

class DigitalClock: public Observer { public:

DigitalClock(ClockTimer *);

~DigitalClock();

void Update(Subject *);

void Draw();

private:

ClockTimer *_subject;

};

(17)

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();

(18)

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:

(19)

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:

(20)

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.

(21)

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

Cytaty

Powiązane dokumenty

In practice, depending on the size of the zone of interest, the compression factor of 12 is easy to achieve. On the other hand, the send back data stream is extremely weak, only 2

 Tworzenie obiektów klas produktów należących do tej samej rodziny..  Potrzeba

Adapter stanowi przykład niezwykle użyte- cznego wzorca projektowego, którego działanie polega na dostosowywaniu interfejsu istniejących już obiektów do interfejsu,

 Proces konstruowania musi zezwalać na różne reprezentacje

Na przykład użytkownik interfejsu narzędzi zawiera obiekty jako przyciski i menu, które doprowadzają żądania odzewu do użytkownika wejściowego.. Ale narzędzia nie mogą

dać przy tym użytkownikowi możliwość podstawienia swojej wyspecjalizowanej wersji. CreateFileDialog zamiast. zwykłego dialogu otwarcia pliku da nam dialog z podglądem

 Strategia umożliwia zdefiniowanie rodziny algorytmów realizujących to samo zadanie, ale różniących

Obiekt obserwowany nie musi wiedzieć ilu ma obserwatorów, ani kto jest odbiorcą jego powiadomienia, dzięki temu można ich swobodnie dodawać i usuwać. Obserwatorzy nie wiedzą o