Ü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 ...
Anlaşılır ve güzel bir yazı olmuş.
YanıtlaSil