Łańcuch zobowiązań

0

Witam,

próbuję zaimplementować łańcuch zobowiązań. Niestety nie działa on prawidłowo. Problem polega na tym, że w poniższym przykładzie dla

handler2.getAnimal()

na wyjściu otrzymuję wartość null. Z góry dziękuję za każdą pomoc.

public class Main {
    static Handler getChain(){
        DogHandler dog = new DogHandler();
        CatHandler cat = new CatHandler();
        dog.setSuccesor(cat);
        return dog;
    }
    public static void main(String[] args) {
        Handler handler = getChain();
        handler.loadAnimal("dog");
        System.out.println(handler.getAnimal());// output "dog"

        Handler handler2 = getChain();
        handler2.loadAnimal("cat");
        System.out.println(handler2.getAnimal());//output null
    }
}
public interface Chainable {
     void setSuccesor(Handler succesor);
     Handler getSuccesor();
}
abstract class Handler implements Chainable{
    private Handler succesor;
    private String animal;

    @Override
    public void setSuccesor(Handler succesor) {
        this.succesor = succesor;
    }

    @Override
    public Handler getSuccesor() {
        return this.succesor;
    }

    protected void forward(String request){
        if(this.succesor != null){
            this.getSuccesor().loadAnimal(request);
        }
    }
    abstract void loadAnimal(String request);

    public String getAnimal() {
        return animal;
    }

    public void setAnimal(String animal) {
        this.animal = animal;
    }
}
public class DogHandler extends Handler {
    @Override
    void loadAnimal(String request) {
        if(request.equals("dog")){
            setAnimal("dog");
        }else{
            forward(request);
        }

    }
}

public class CatHandler extends Handler {
    @Override
    void loadAnimal(String request) {
        if(request.equals("cat")){
            setAnimal("cat");
        }else{
            forward(request);
        }
    }
}

0

Podejrzewam, że handler2 jest typu DogHandler i nie została w nim ustawiona zmienna animal na "cat". "cat" wyświetli się jak handler2.getSuccessor.getAnimal()
Podejrzewam, że brakuje w getAnimal() sprawdzenia czy nie należy szukać wartości w kolejnym elemencie łańcucha (ale nie wiem co chciałeś uzyskać).

Btw. Zamiast request.equals("dog") lepiej pisać "dog".equals(request) wtedy nie powinno być problemów z null pointerami request.

1 użytkowników online, w tym zalogowanych: 0, gości: 1