A felelősség láncolata

Ez a cikk publikálhatatlan munkákat vagy nem ellenőrzött nyilatkozatokat tartalmazhat (2014. október).

Segíthet referenciák hozzáadásával vagy a közzé nem tett tartalom eltávolításával. További részletekért lásd a beszélgetés oldalt .

A szoftverfejlesztés , a felügyeleti lánc tervezési minta segítségével tetszőleges számú osztályok megpróbálok válaszolni egy kérdésre, anélkül, hogy tudnánk a lehetőségeket más osztályokba az adott lekérdezésben. Ez lehetővé teszi az objektumok közötti kapcsolatok csökkentését. Az egyetlen közös kapcsolat ezek között az objektumok között az a kérés, amely egyik objektumból a másikba megy, amíg az egyik objektum válaszolni nem tud. Ez a tervezési minta lehetővé teszi a kezelés különböző szakaszainak elkülönítését és az öröklési kapcsolatok egyszerű megvalósítását is.

használat

Amint egy információnak több kezelést kell kapnia, vagy csak továbbítania kell a különböző tárgyak között.

Példa C ++ nyelven

Az alábbi példa egy naplózási rendszert mutat be. Amikor üzenet érkezik, az egyik naplózóról a másikra vált, elindítva vagy nem a társított feldolgozást.

#include <iostream> #include <string> using namespace std; class Logger { protected: int level; Logger* next; public: enum { ERR, NOTICE, DEBUG }; Logger* setNext(Logger* next) { this->next = next; return (this->next); } void message(string msg, int priority) { if (priority <= this->level) this->writeMessage(msg); else if (this->next != NULL) this->next->message(msg, priority); } virtual void writeMessage(string msg) = 0; }; class DebugLogger : public Logger { public: DebugLogger(int level) { this->level = level; this->next = NULL; } void writeMessage(string msg) { cout << "Message de debug : " << msg << endl; } }; class EmailLogger : public Logger { public: EmailLogger(int level) { this->level = level; this->next = NULL; } void writeMessage(string msg) { cout << "Notification par email : " << msg << endl; } }; class ErrorLogger : public Logger { public: ErrorLogger(int level) { this->level = level; this->next = NULL; } void writeMessage(string msg) { cerr << "Erreur : " << msg << endl; } }; int main() { // Construction de la chaine de responsabilite ErrorLogger logger(Logger::ERR); EmailLogger logger2(Logger::NOTICE); DebugLogger logger3(Logger::DEBUG); logger.setNext(&logger2); logger2.setNext(&logger3); logger.message("An error has occurred.", Logger::ERR); // Le message est traité par le premier logger (ErrorLogger) logger.message("Step1 completed.", Logger::NOTICE); // S'arrête au deuxième logger (EmailLogger) logger.message("Entering function y.", Logger::DEBUG); // Traverse toute la chaine de commande return 0; }

Lásd is