14 Nisan 2013 Pazar

DECORATOR DESİGN PATTERN ( DEKORATÖR TASARIM MODELİ )


Ürünleri hızlı bir şeklide artan ve çeşitlilik gösteren programlar için kullanılan tasarım modeline decorator pattern denir.
  
            Mevcut tasarım decorator pattern ile fazla oynamadan değişiklik yapmamıza olanak verir ve bu tasarım modeli genişlemeye uygun modifikasyona kapalı bir hal alır. Yapıyı oluşturmamız için tek başına inheritance yapısını kullanmamız yeterli olmayacaktır.  
Temelde elimizde bir nesne varken arka planda birden çok nesne olabilir ama uygulama tek nesne üzerinden işlem yapar.





Decorator pattern yapısını şekil üzerinde göstermeye çalışırsak aşağıdaki gibi bir şekil çizebiliriz.

Burada nesneye yeni metotlar eklenmez strateji pattern gibi. Sadece nesnenin kabuğu değişir bunu da yanda çizdiğim şekilde görebiliriz. Burada her nesne donattığı nesnenin adresini tutmaktadır ve değer dönerken en içten dışa doğru döner.





Şimdi de bu anlattığım konularla ilgili bir uygulama yazalım.




#include<iostream>
#include<string>

using namespace std ;
//*******************
//beverage class
//*******************
class Beverage {

protected:
       string description ; // alt sınıflarda tekrar tanımlamamak için protected tanımladım...

public :

       Beverage()
       {
             description="Unknown Beverage";
       }


       virtual string getDescription()
       {
             return description ;
       }

       virtual double cost() =0;

};
//*******************
//Tavukmenu class
//*******************
class TavukMenu:public Beverage {

public :

       string getDescription()
       {
             return "Tavuk menu ";
       }

       double cost ()
       {
             return 4.5 ;
       }
};
//*******************
//Etmenu class
//*******************

class EtMenu:public Beverage {

public :

       string getDescription()
       {
             return "Et menu ";
       }

       double cost ()
       {
             return 6.5 ;
       }
};
//*******************
//decorator class
//*******************
class Decorator:public Beverage {

public :                      // decorator class ekleme yapacağımız nesnelere ulaşmamızı sağlıyacak ...

       virtual string getDescription()
       {
             return " decorator  ";
       }

};
//*******************
//acısos class
//*******************

class AcıSos:public Decorator {

       Beverage *beverage ;

public :
       AcıSos(Beverage * p )
       {
             this->beverage = p ;
       }

       string getDescription()
       {
             return beverage->getDescription() + " - aci sos ";
       }

       double cost ()
       {
              return beverage->cost()+ 0.50 ;
       }
};

//*******************
//buffalosos class
//*******************
class BuffaloSos:public Decorator {

       Beverage *beverage ;

public :
       BuffaloSos(Beverage * p )
       {
             this->beverage = p ;
       }

       string getDescription()
       {
             return beverage->getDescription() + " - buffalo sos ";
       }

       double cost ()
       {
             return beverage->cost()+ 0.75 ;
       }
};

//*******************
//ranchsos class
//*******************
class RanchSos:public Decorator {

       Beverage *beverage ;

public :
       RanchSos(Beverage * p )
       {
             this->beverage = p ;
       }

       string getDescription()
       {
             return beverage->getDescription() + " - ranch sos ";
       }

       double cost ()
       {
             return beverage->cost()+ 0.75 ;
       }
};
//*******************
//büyükmenu class
//*******************
class BuyukMenu:public Decorator {

       Beverage *beverage ;

public :
       BuyukMenu(Beverage * p )
       {
             this->beverage = p ;
       }

       string getDescription()
       {
             return beverage->getDescription() + " - buyuk menu ";
       }

       double cost ()
       {
             return beverage->cost()+ 3.50 ;
       }
};
//*******************
//main
//*******************
int main ()
{
       Beverage * beverage = new TavukMenu() ;
       cout<<beverage->getDescription()<<beverage->cost()<<" tl "<<endl;

       Beverage *beverage2 = new TavukMenu();
       beverage2=new AcıSos(beverage2);
       beverage2=new BuffaloSos(beverage2);
       beverage2=new RanchSos(beverage2);
       beverage2=new BuyukMenu(beverage2);
       cout<<beverage2->getDescription()<<beverage2->cost()<<" tl "<<endl;
      
       cout<<endl <<"***********************************************"<<endl <<endl;
      
       Beverage * beverage3 = new EtMenu() ;
       cout<<beverage3->getDescription()<<beverage3->cost()<<" tl "<<endl;
       Beverage *beverage4 = new EtMenu();
       beverage4=new AcıSos(beverage4);
       beverage4=new BuyukMenu(beverage4);
       cout<<beverage4->getDescription()<<beverage4->cost()<<" tl "<<endl;
       system("pause " );
       return 0 ;
}





output: 




           Şekil üzerinde de görüldüğü gibi tavuk menü ve et menü tek başına kendi fiyatlarını döndürürken eklentiler sonucunda toplam fiyat döndürülmektedir. Buda decorator patternin genel yapısını oluşturmaktadır.

Zaman ayırdığınız için teşekkürler J
Lütfen yorum yapınız ...






1 yorum: