Wzorzec projektowy łańcuch zobowiązań - chain of responsibility

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 3513 razy

Opis wzorca projektowego łańcuch zobowiązań

Wzorzec projektowy łańcuch zobowiązań należy do czynnościowych wzorców projektowych. Umożliwia on tworzenie listy zadań (czynności), które będą wykonywane kolejno do momentu, gdzie nie będzie już więcej zadań do zrealizowania. Każde pod zadanie jest reprezentowane przez oddzielną klasę, która dziedziczy po wspólnym interfejsie. Interfejs ten agreguje interfejsy nowych zadań dodanych do listy. Łańcuch zobowiązań może być zamknięty lub otwarty. W przypadku jego zamknięcia zadania będą realizowane do momentu przerwania przez użytkownika.

Przykładowy diagram UML wzorca projektowego łańcuch zobowiązań

Na poniższym diagrami UML można zobaczyć klasy zadań, które muszą być zrealizowane aby możliwe było wystrzelenie pocisku z działa. Tymi zadaniami są obiekty klas:

Wszystkie powyższe klasy dziedziczą po jednym interfejsie iReload, który może agregować kolejne zadanie interfejsu oraz ma dostępną metodę umożliwiającą dodanie kolejnego zadania do zrealizowania na końcu łańcucha.

Przykład diagramu UML dla wzorca projektowego łańcuch zobowiązań
Rys. 1
Przykład diagramu UML dla wzorca projektowego łańcuch zobowiązań

Przykładowa implementacja wzorca projektowego łańcuch zobowiązań w C++

#include <iostream> #include <string> #include <windows.h> class iReload{ protected: iReload* task; public: inline iReload() : task(NULL){} void addNextTask(iReload* task){ if(this->task == NULL){ this->task = task; }else{ this->task->addNextTask(task); } } virtual iReload* doTask() const = 0; }; class RemoveRim : public iReload{ public: iReload* doTask() const { std::cout << "Remove rim from gun, please wait!" << std::endl; for(int i = 0; i < 30; i++){ std::cout << "#"; Sleep(100); } std::cout << std::endl<<"Rim is removed!!!" << std::endl << std::endl; return task; } }; class PutBullet : public iReload{ public: iReload* doTask() const { std::cout << "Put bullet in gun, please wait!" << std::endl; for(int i = 0; i < 30; i++){ std::cout << "#"; Sleep(100); } std::cout << std::endl<<"Bullet is loaded!!!" << std::endl << std::endl; return task; } }; class Fire : public iReload{ public: iReload* doTask() const { std::cout << "Ready to fire:" << std::endl; std::cout << "Fire [0]" << std::endl; std::cout << "Exit [not 0]" << std::endl; int w = 0; std::cin >> w; switch(w){ case 0: std::cout << "Fired!!!" << std::endl; return task; default: return NULL; } } }; int main(){ RemoveRim removerim; PutBullet putbullet; Fire fire; removerim.addNextTask(&putbullet); removerim.addNextTask(&fire); fire.addNextTask(&removerim); iReload* reloadgun = &removerim; do{ reloadgun = reloadgun->doTask(); }while(reloadgun); std::cin.get(); return 0; }

Wynik działania powyższego kodu:

Remove rim from gun, please wait!
##############################
Rim is removed!!!

Put bullet in gun, please wait!
##############################
Bullet is loaded!!!

Ready to fire:
Fire [0]
Exit [not 0]
0
Fired!!!
Remove rim from gun, please wait!
##############################
Rim is removed!!!

Put bullet in gun, please wait!
##############################
Bullet is loaded!!!

Ready to fire:
Fire [0]
Exit [not 0]
Strony powiązane
strony powiązane
  1. sourcemaking.com/design_patterns/chain_of_responsibility - strona opisująca wzorzec projektowy łańcuch zobowiązań [En]
  2. pl.wikipedia.org - opis tego wzorca na stronie Wikipedii
Propozycje książek
tytuł: C++. Projektowanie oprogramowania. Zasady i wzorce projektowe autor: Klaus Iglberger

Tytuł:

C++. Projektowanie oprogramowania. Zasady i wzorce projektowe

Autor:

Klaus Iglberger

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III autor: Carlos Santana Roldán

Tytuł:

React 17. Wzorce projektowe i najlepsze praktyki. Projektowanie i rozwijanie nowoczesnych aplikacji internetowych. Wydanie III

Autor:

Carlos Santana Roldán

tytuł: Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II autor: Eric Freeman, Elisabeth Robson

Tytuł:

Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II

Autor:

Eric Freeman, Elisabeth Robson

tytuł: Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku autor: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Tytuł:

Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku

Autor:

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

tytuł: Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III autor: Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

Tytuł:

Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III

Autor:

Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

tytuł: Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych autor: Bilgin Ibryam,  Roland Huß

Tytuł:

Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych

Autor:

Bilgin Ibryam, Roland Huß

tytuł: Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II autor: Alan Shalloway, James R. Trott

Tytuł:

Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II

Autor:

Alan Shalloway, James R. Trott

W związku z tym, że firma Helion nie wywiązuje się z swoich zobowiązań naliczania prowizji za każdą zakupioną książkę a kontakt z ową frmą jest nie możliwy autor strony zmuszony został do zablokowania linkowania książek. Za wszelkie niedogodności z tym związane z góry przepraszam i obiecuję włączenie linkowania gdy tylko sprawa zostanie wyjaśniona