Zielony Smok - logo witryny

Chain Of Responsibility = łańcuch odpowiedzialności.

Zadanie programistyczne

Uruchomić obsługę zleceń w zależności od posiadanych możliwości decyzji.

Rozwiązanie

Zastosować Chain Of Responsibility (Łańcuch Odpowiedzialności).

Utworzyć:

  1. Klasę abstrakcyjną Lancuch
  2. Utworzyć obiekt przekazywany ZlecenieZakupu
  3. Utworzyć ogniwa łańcucha – klasy implementujące Lancuch
  4. Utworzyć klasę Main i powiązać ogniwa w łańcuch

Uwagi:

Klasy są nie powiązane i jedna nie wie nic o drugiej.

Jedyne co je łączy to przekazywane zlecenie

Czasem podaje się przykład sortowni przekazującej kolejno obiekt
aż do klasy, która potrafi go obsłużyć.

Klasy

Klasa Lancuch
package chainofresponsibility;
abstract class Lancuch {
    private Lancuch nastepneOgniwo;
    private final String nazwa;
    Lancuch(String nazwa) {
        this.nazwa = nazwa;
    }
    String getNazwa() {
        return nazwa;
    }
    protected abstract boolean autoryzuj(ZlecenieZakupu request);
    Lancuch getNextHandler() {
        return nastepneOgniwo;
    }
    public void setNextHandler(Lancuch handler) {
        nastepneOgniwo = handler;
    }
}
Klasa ZlecenieZakupu
package chainofresponsibility;
class ZlecenieZakupu {
    private final int id;
    private final String opis;
    private final double kwota;
    public ZlecenieZakupu(int id, String opis, double kwota) {
        this.id = id;
        this.opis = opis;
        this.kwota = kwota;
    }
    public double getKwota() {
        return kwota;
    }
    @Override
    public String toString() {
        return id + ":" + opis;
    }
}
Klasa KierownikDzialu
package chainofresponsibility;
public class KierownikDzialu extends Lancuch {
    private static final double LIMIT = 100000;
    public KierownikDzialu(String nazwa) {
        super(nazwa);
    }
    @Override
    public boolean autoryzuj(ZlecenieZakupu zlecenie) {
        double kwota = zlecenie.getKwota();
        if (kwota <= LIMIT) {
            System.out.println(" Kierownik Działu:  " + getNazwa() + " podpisał zlecenie: " + zlecenie);
            return true;
        } else {
            return getNextHandler().autoryzuj(zlecenie);
        }
    }
}
Klasa KierownikRegionalny
package chainofresponsibility;
public class KierownikRegionalny extends Lancuch {
    private static final double LIMIT = 200000;
    public KierownikRegionalny(String nazwa) {
        super(nazwa);
    }
    @Override
    public boolean autoryzuj(ZlecenieZakupu zlecenie) {
        double kwota = zlecenie.getKwota();
        if (kwota <= LIMIT) {
            System.out.println(" Kierownik Regionalny: " + getNazwa() + " podpisał zlecenie: " + zlecenie);
            return true;
        } else {
            return getNextHandler().autoryzuj(zlecenie);
        }
    }
}
Klasa ZastepcaPrezesa
package chainofresponsibility;
public class ZastepcaPrezesa extends Lancuch {
    private static final double LIMIT = 300000;
    public ZastepcaPrezesa(String nazwa) {
        super(nazwa);
    }
    @Override
    public boolean autoryzuj(ZlecenieZakupu zlecenie) {
        double kwota = zlecenie.getKwota();
        if (kwota <= LIMIT) {
            System.out.println(" Zastepca Prezesa: " + getNazwa() + " podpisał zlecenie: " + zlecenie);
            return true;
        } else {
            return getNextHandler().autoryzuj(zlecenie);
        }
    }
}
Klasa Prezes
package chainofresponsibility;
public class Prezes extends Lancuch {
    private static final double LIMIT = 500000;
    public Prezes(String nazwa) {
        super(nazwa);
    }
    @Override
    public boolean autoryzuj(ZlecenieZakupu zlecenie) {
        double kwota = zlecenie.getKwota();
        if (kwota <= LIMIT) {
            System.out.println(" Prezes: " + getNazwa() + " podpisał zlecenie: " + zlecenie);
            return true;
        } else {
            System.out.println(
                    " Zlecenie:  " + zlecenie + " nie może byc podpisane.\n " + "Wymaga Zebrania Wspólników. ");
            return false;
        }
    }
}
Klasa Main
package chainofresponsibility;
class Main {
    private KierownikDzialu kierownikDzialu;
    public static void main(String[] args) {
        Main manager = new Main();
        manager.przeplywOdpowiedzialnosci();
        ZlecenieZakupu zlecenie = new ZlecenieZakupu(1, " Zakup wyposażenia", 10000);
        manager.kierownikDzialu.autoryzuj(zlecenie);
        zlecenie = new ZlecenieZakupu(2, " Zakup Super Komputera", 275000);
        manager.kierownikDzialu.autoryzuj(zlecenie);
        zlecenie = new ZlecenieZakupu(3, " Zakup Działki", 800000);
        manager.kierownikDzialu.autoryzuj(zlecenie);
    }
    private void przeplywOdpowiedzialnosci() {
        kierownikDzialu = new KierownikDzialu("Robert A.");
        KierownikRegionalny kierownikRegionalny = new KierownikRegionalny("Jacek B.");
        ZastepcaPrezesa zastepcaPrezesa = new ZastepcaPrezesa("Marian C.");
        Prezes prezes = new Prezes("Maria M.");
        kierownikDzialu.setNextHandler(kierownikRegionalny);
        kierownikRegionalny.setNextHandler(zastepcaPrezesa);
        zastepcaPrezesa.setNextHandler(prezes);
    }
}

Wynik

 Kierownik Działu:  Robert A. podpisał zlecenie: 1: Zakup wyposażenia
 Zastepca Prezesa: Marian C. podpisał zlecenie: 2: Zakup Super Komputera
 Zlecenie:  3: Zakup Działki nie może byc podpisane.
 Wymaga Zebrania Wspólników.