Observer design pattern ingilizce karşılığından da anlaşılacağı gibi gözlenen ve gözetleyen ilişkisine dayanan bir pattern türüdür.
problem
Observer patter Problemini bir örnek üzerinden anlatmak istiyorum. Mesela
bir dergiye üyesiniz ve sizle birlikte birçok kişi üye vede derginin internette
sayfası var diyelim. Dergide herhangi bir değişiklik olduğunda yada yeni sayı
geldiğinde tüm üyelere bilgi verilmeli ve net ortamında yayınlanmalı. Sorunda bu
aşamada karşımıza çıkıyor tüm üyelere ayrı ayrımı gönderilecek ?
Amaç
Tabikide
sorunu gidermek için tüm üyelere ve internete ayrı ayrı bilgi gönderilmeyecek,
amacımız bu işlemi tek bir satır ile tüm üyelere haber verebilmek .Zaten bu işlemde observer pattern yapısıdır.
Çözüm
Çözüm olarak
observe pattern gereği soyut ve somut sınıflarımızı oluşturmamız gerekmektedir.
Daha sonra kişileri üye yaptıktan sonra herhangi bir değişim anında
setfonksiyonu ile değişimi bildiriyoruz daha sonra notifyobserver fonksiyonunu
çağırıyoruz ve oda tüm üyelere ve web sayfasına değişiklikleri bildiriyoruz.
Genel olarak uml diagramını aşağıdaki gibi ifade edebiliriz.
Kod
#include<iostream>
#include<string>
#include<list>
using namespace std ;
class Observer{
public:
virtual void update(string temp)=0;
};
class Subject{
public:
virtual void registerObserver(Observer *)=0;
virtual void removeObserver(Observer *)=0;
virtual void notifyObservers() const=0;
};
class Dergi:public Subject{
private:
mutable list<Observer*> observers;
string temp;
public:
Dergi(){}
void registerObserver(Observer* o){observers.push_back(o);}
void removeObserver(Observer* o){observers.remove(o);}
void notifyObservers() const
{
for( list< Observer* >::iterator iter=observers.begin(); observers.end() !=
iter; ++iter ) {
Observer* observer = *iter;
observer->update(temp);
}
}
void setChange(string temp)
{
this->temp=temp;
notifyObservers();
}
};
class Clients:private Observer{
private:
Subject *derg;
string temp ;
list <Clients*> c;
public:
Clients(Subject* k)
{
this->derg=k;
derg->registerObserver(this);
}
~Clients() {
derg->removeObserver( this );
}
void update( string temp ) {
this->temp= temp;
display();
}
void display() const
{
cout<<temp<<"for clients !!!"<<endl;
}
};
class web:private Observer{
private:
Subject *derg;
string temp ;
list <web*> w;
public:
web(Subject* k)
{
this->derg=k;
derg->registerObserver(this);
}
~web() {
derg->removeObserver( this );
}
void update( string temp ) {
this->temp= temp;
display();
}
void display() const
{
cout<<temp<<"for webbb !!!"<<endl;
}
};
int main ()
{
Dergi *d = new Dergi();
Clients *c = new Clients(d);
web *w = new web(d);
d->setChange("1. yayin");
cout<<"------------------------------"<<endl;
d->setChange("2. yayin");
cout<<"------------------------------"<<endl;
d->setChange("3. yayin");
system("pause");
return 0 ;
}
Output
Sonuç
Observe design pattern bize bir tık ile haber verilmesi gereken
yerlere aynı anda haber vermeye olanak sağlayan bir pattern yapısıdır.
Zaman ayırdığınız için teşekkürler J
Lütfen yorum yapınız ...
Hiç yorum yok:
Yorum Gönder