Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Wzorce projektowe

łańcuch zobowiązań

[wzorzec projektowy] Przekazuje odpowiedzialność za wykonanie zadania do kolejnego obiektu jeżeli obecny obiekt nie wie jak obsłużyć przychodzące zadanie.

Budowa wzorca projektowego

C/C++
class IZadanie
{
public:
    //INFO: dowolna implementacja, np.
    virtual int dajRodzajZadania() const = 0;
};

class IObiektObslugujacy
{
public:
    virtual bool obslugaZadania( IZadanie * pZadanie ) = 0;
    //INFO: klasy dziedziczące interfejs IObiektObslugujacy mogą decydować czy potrafią obsłużyć zadanie na podstawie pZadanie->dajRodzajZadania().
};

class CLancuchZobowiazan
{
protected:
    std::list < IObiektObslugujacy *> m_vObsluga;
public:
    bool obsluzZadanie( IZadanie * pZadanie )
    {
        //INFO: obsługa zadań metodą łańcucha zobowiązań
        for( std::list < IObiektObslugujacy *>::iterator i = m_vObsluga.begin(); i != m_vObsluga.end(); i++ )
        {
            if(( * i )->obslugaZadania( pZadanie ) )
                 return true;
           
        } //for
        return false;
    }
};

Opis szczegółowy

Łańcuch zobowiązań (ang. chain of responsibility) - wzorzec projektowy, który automatycznie przekazuje odpowiedzialność za wykonanie zadania do następnika, jeżeli obecny obiekt nie potrafi obsłużyć otrzymanego zadania. W przypadku gdy następnik nie istnieje - zadanie zostaje odrzucone. Łańcuch zobowiązań można wyobrazić sobie jako listę obiektów obsługujących, którą przechodzimy dopóki nie znajdziemy obiektu, który będzie w stanie obsłużyć żądane zadanie. Poniżej zamieszczam jedną z możliwych form implementacji:
C/C++
std::list < IObiektObslugujacy *> lista_obiektow_obslugujacych;
//INFO: tu ustawienie listy obiektów obsługujących zadania
//(...)

IZadanie * pZadanie = NULL;
//INFO: tu ustawienie zadania, które ma zostać wykonane przez obiekt, który będzie potrafił je obsłużyć
//(...)

//INFO: obsługa zadań metodą łańcucha zobowiązań
for( std::list < IObiektObslugujacy *>::iterator i = lista_obiektow_obslugujacych.begin(); i != lista_obiektow_obslugujacych.end(); i++ )
{
    if(( * i )->obslugaZadania( pZadanie ) )
         break;
   
} //for

Pozostałe informacje

Możliwości implementacji łańcucha zobowiązań jest wiele - zasada działania pozostaje jednak ta sama.