13 Nisan 2013 Cumartesi

OBSERVER DESİGN PATTERN ( GÖZLEMCİ TASARIM MODELİ )

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