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ć:
- Klasę abstrakcyjną
Lancuch
- Utworzyć obiekt przekazywany
ZlecenieZakupu
- Utworzyć ogniwa łańcucha – klasy implementujące
Lancuch
- 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.