Ланац одговорности (пројектни узорак)
Ланац одговорности је објектно-оријентисани пројектни узорак. Ланац одговорности повезује објекте којима се упућује захтев у ланац. Тако повезаним објектима се прослеђује захтев, који се редом низ ланац обрађује све док се не изврши.

Учесници

Захтев 
Захтев који клијент жели да разрешава.

Обрађивач 
Апстрактна класа Обрађивач представља класу у којој се креира ланац обрађивача захтева помоћу атрибута "наредни обрађивач". Када обрађивач добије неки захтев да разреши, тада конкретни обрађивачи имлементирају методу за обраду захтева на себи својствен начин ако су у стању да разреше захтев, у супротном зову методу обраде захтева наслеђене класе (у овом случају методу из класе Обрађивач) која прослеђује захтев наредном конкретном обрађивачу у ланцу који је креиран.

Конкретни обрађивач 
Конкретни обрађивач имплементира методу за обраду захтева. Ако није у стању да обради захтев позива методу обраде захтева из наслеђене класе (Обрађивач) која ће се побринути да се тај захтев проследи наредном обрађивачу у ланцу.

Примери

C++ 
#include <iostream>

class Zahtev {
public:
    Zahtev(int br) : brojZahteva(br) {}
    int getBrojZahteva() {
        return brojZahteva;
    }
private:
    int brojZahteva;
};

class Obradjivac {
public:
    Obradjivac() : naredniObradjivac(NULL) {}
    Obradjivac(Obradjivac *sledeci) : naredniObradjivac(sledeci) {}
    Obradjivac* getObradjivac() {
        return naredniObradjivac;
    }
    void setNaredniObradjivac(Obradjivac *naredni) {
        naredniObradjivac = naredni;
    }
    virtual void obradaZahteva(Zahtev *zahtev) {
        if (naredniObradjivac != NULL)
            naredniObradjivac->obradaZahteva(zahtev);
        else
            std::cout << "Nije moguce obraditi zahtev." << std::endl;
    }
private:
    Obradjivac *naredniObradjivac;
};

class KonkretniObradjivac1 : public Obradjivac {
public:
    void obradaZahteva(Zahtev *zahtev) {
        if (zahtev->getBrojZahteva() == 1)
            std::cout << "KonkretniObradjivac1 je uspesho obradio zahtev." << std::endl;
        else
            Obradjivac::obradaZahteva(zahtev);
    }
};

class KonkretniObradjivac2 : public Obradjivac {
public:
    void obradaZahteva(Zahtev* zahtev) {
        if (zahtev->getBrojZahteva() == 2)
            std::cout << "KonkretniObradjivac2 je uspesno obradio zahtev." << std::endl;
        else
            Obradjivac::obradaZahteva(zahtev);
    }
};

int main() {
    Obradjivac *a1 = new KonkretniObradjivac1();
    Obradjivac *a2 = new KonkretniObradjivac2();
    Obradjivac *a3 = new KonkretniObradjivac1();

    a1->setNaredniObradjivac(a2);
    a2->setNaredniObradjivac(a3);

    Zahtev *z1 = new Zahtev(1);
    Zahtev *z2 = new Zahtev(2);
    Zahtev *z3 = new Zahtev(100);

    std::cout << "Zahtev z1:" << std::endl;
    a1->obradaZahteva(z1);
    std::cout << "\nZahtev z2:" << std::endl;
    a1->obradaZahteva(z2);
    std::cout << "\nZahtev z3:" << std::endl;
    a1->obradaZahteva(z3);
    std::cout << "\nZahtev z1 od a2:" << std::endl;
    a2->obradaZahteva(z1);

    delete a1;
    delete a2;
    delete a3;

return 0;

Референце 

Пројектни узорци