Jak utworzyć klasę, której nie mogę zmienić, zaimplementować interfejs?

Mam klasę z innej biblioteki, która jest zamkniętym źródłem, ale chcę mieć możliwość korzystania z interfejsu. Powodem jest to, że nie chcę tego robićinstanceof czeki lubnull-checks wszędzie, ale nie chcę też rozszerzać istniejącej klasy.

Załóżmy na przykład, że mam ten kod:

public class Example {

    // QuietFoo is from another library that I can't change
    private static QuietFoo quietFoo;
    // LoudFoo is my own code and is meant to replace QuietFoo
    private static LoudFoo loudFoo;

    public static void main(String[] args) {
        handle(foo);
    }

    private static void handle(Object foo) {
        if (foo instanceof QuietFoo)
            ((QuietFoo) foo).bar();
        else if (foo instanceof LoudFoo)
            ((LoudFoo) foo).bar();
    }
}

Nie mogę się zmienićQuietFoo:

public class QuietFoo {

    public void bar() {
        System.out.println("bar");
    }
}

Ale jamogą zmianaLoudFoo:

public class LoudFoo {

    public void bar() {
        System.out.println("BAR!!");
    }
}

Problem polega na tym, że może istnieć wiele innych implementacjibar w wielu klasach i może być więcej metod niż tylkobar, więc nie tylko mójhandle metoda staje się powolna i brzydka z dużą ilościąinstanceof instrukcji, ale musiałbym napisać jedną z tych metod obsługi dla każdej metodyQuietFoo iLoudFoo. Rozszerzenie nie jest realnym rozwiązaniem, ponieważ narusza całośćjest kontrakt odLoudFoo nie jestQuietFoo.

Zasadniczo podaneFoo:

public interface Foo {
    void bar();
}

Jak mogę to zrobićQuietFoo wprowadzić w życieFoo bez zmiany źródła, więc nie muszę robić castingu iinstanceof połączenia wszędzie w moim kodzie?

questionAnswers(1)

yourAnswerToTheQuestion