Lanac odgovornosti (projektni uzorak)

S Vikipedije, slobodne enciklopedije

Lanac odgovornosti je objektno-orijentisani projektni uzorak. Lanac odgovornosti povezuje objekte kojima se upućuje zahtev u lanac. Tako povezanim objektima se prosleđuje zahtev, koji se redom niz lanac obrađuje sve dok se ne izvrši.[1]

Učesnici[uredi | uredi izvor]

Zahtev[uredi | uredi izvor]

Zahtev koji klijent želi da razrešava.

Obrađivač[uredi | uredi izvor]

Apstraktna klasa Obrađivač predstavlja klasu u kojoj se kreira lanac obrađivača zahteva pomoću atributa "naredni obrađivač". Kada obrađivač dobije neki zahtev da razreši, tada konkretni obrađivači imlementiraju metodu za obradu zahteva na sebi svojstven način ako su u stanju da razreše zahtev, u suprotnom zovu metodu obrade zahteva nasleđene klase (u ovom slučaju metodu iz klase Obrađivač) koja prosleđuje zahtev narednom konkretnom obrađivaču u lancu koji je kreiran.

Konkretni obrađivač[uredi | uredi izvor]

Konkretni obrađivač implementira metodu za obradu zahteva. Ako nije u stanju da obradi zahtev poziva metodu obrade zahteva iz nasleđene klase (Obrađivač) koja će se pobrinuti da se taj zahtev prosledi narednom obrađivaču u lancu.[2]

Primeri[uredi | uredi izvor]

C++[uredi | uredi izvor]

#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;

Reference[uredi | uredi izvor]

  1. ^ ETF Lanac odgovornosti (PDF). str. 2,3,4,5 i 6 http://rti.etf.bg.ac.rs/rti/ir4ps/predavanja/Projektni%20uzorci/21%20Lanac%20odgovornosti.pdf. Pristupljeno 21. april 2017.  Nedostaje ili je prazan parametar |title= (pomoć)
  2. ^ Lanac odgvornosti-učesnici (PDF). str. 7 http://rti.etf.bg.ac.rs/rti/ir4ps/predavanja/Projektni%20uzorci/21%20Lanac%20odgovornosti.pdf. Pristupljeno 21. april 2017.  Nedostaje ili je prazan parametar |title= (pomoć)