Skip to content

Instantly share code, notes, and snippets.

@bunyamintamar
Last active April 8, 2022 16:04
Show Gist options
  • Select an option

  • Save bunyamintamar/69e19ac365dcfdba967a0354d221bc92 to your computer and use it in GitHub Desktop.

Select an option

Save bunyamintamar/69e19ac365dcfdba967a0354d221bc92 to your computer and use it in GitHub Desktop.
Sorumluluk Zinciri Tasarım Kalıbı - Chain of Responsibility Design Pattern
/* Sorumluluk Zinciri Tasarım Kalıbı Örneği - Chain of Responsibility Design Pattern */
/*
Bir objenin başka bir objeden bir işlem için istekte bulunduğu, fakat istekte bulunulan
nesnenin de yine başka bir nesneye istekte bulunduğu bir yapımızın olduğunu düşünelim.
Yani bir hiyerarşik düzen var. Bu yapıda nesnelerimizin bu hiyerarşik düzenin
kurallarını bilmesi gerekir değil mi?
İşte burada işlemlerin basitçe ve hiyerarşik düzeni bozmadan gerçekleştirilebilmesi
için bu tasarım kalıbı kullanılır.
Hiyerarşik düzenin kurallarını anlatan bir soyut sınıf ile düzen sağlanır.
Bu soyut sınıfta nesnenin kendi işlemlerini bitirdikten sonraki işi kime bırakacağı
bildirilir. Yani amirini belirtmek lazım ki kendi işi bitince amirine işi devretsin.
Nesnelerimiz de bu soyut sınıftan miras alarak oluşturulmalıdır.
Bu tasarım kalıbını bir çalışanın izin işlemlerinin yapıldığı bir hiyerarşik düzen üzerinden
anlatalım.
*/
#include <iostream>
#include <string>
using namespace std;
/**************************************************************************/
class IzinIslemleri // Kuralların düzenlendiği SOYUT sınıf
{ // Kurallar soyuttur :)
protected:
IzinIslemleri *gorevli; // instance
public:
IzinIslemleri()
{
gorevli = nullptr;
}
virtual ~IzinIslemleri() {}
virtual void izinTalebiniAl(string istekMetni) = 0; // saf sanal
void amiriBelirle(IzinIslemleri *gorevli)
{
this->gorevli = gorevli;
}
};
/**************************************************************************/
class IlkAmir : public IzinIslemleri
{
private:
string isim;
string cevapCumlesi;
public:
IlkAmir() {}
IlkAmir(string isim, string cevapCumlesi)
{
this->isim = isim;
this->cevapCumlesi = cevapCumlesi;
}
void izinTalebiniAl(string istekMetni)
{
/* İlk amire özel işlemler tamamlanır */
cout << "---------------------------" << endl;
cout << "Merhaba, ben " << isim << endl;
cout << "İsteğiniz: " << istekMetni << endl;
cout << "Cevap : " << cevapCumlesi << endl;
/* İkinci amire işleri devret */
if(gorevli)
gorevli->izinTalebiniAl(istekMetni);
}
};
class IkinciAmir : public IzinIslemleri
{
private:
string isim;
string cevapCumlesi;
public:
IkinciAmir() {}
IkinciAmir(string isim, string cevapCumlesi)
{
this->isim = isim;
this->cevapCumlesi = cevapCumlesi;
}
void izinTalebiniAl(string istekMetni)
{
/* İkinci amire özel işlemler tamamlanır */
cout << "---------------------------" << endl;
cout << "Merhaba, ben " << isim << endl;
cout << "İsteğiniz: " << istekMetni << endl;
cout << "Cevap : " << cevapCumlesi << endl;
/* Başka amir yok */
// ....
}
};
/**************************************************************************/
int main()
{
string istekMetni = "Sayın amirimden bir gün izin talep ediyorum";
IzinIslemleri *ilkAmir = new IlkAmir("Ali", "Talebinizi Veli Bey'e iletiyorum");
IzinIslemleri *ikinciAmir = new IkinciAmir("Veli", "İzin verdim gitti");
ilkAmir->amiriBelirle(ikinciAmir); // Ali'nin amiri Veli
ilkAmir->izinTalebiniAl(istekMetni); // Zincirin ilk halkasi isteği aldı
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment