Last active
April 8, 2022 16:04
-
-
Save bunyamintamar/69e19ac365dcfdba967a0354d221bc92 to your computer and use it in GitHub Desktop.
Sorumluluk Zinciri Tasarım Kalıbı - Chain of Responsibility Design Pattern
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* 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