Как мне сделать класс, который я не могу изменить, реализовать интерфейс?

У меня есть класс из другой библиотеки с закрытым исходным кодом, но я хочу иметь возможность использовать интерфейс для него. Причина в том, что я не хочу делатьinstanceof чеки илиnull- проверяет везде, но я также не хочу расширять существующий класс.

Например, допустим, у меня есть этот код:

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();
    }
}

Я не могу изменитьQuietFoo:

public class QuietFoo {

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

Но яМожно менятьLoudFoo:

public class LoudFoo {

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

Проблема в том, что может быть много других реализацийbar во многих классах, и там может быть больше методов, чем простоbar, так что не только мойhandle метод становится медленным и уродливым с большим количествомinstanceof заявления, но я должен был бы написать один из этих методов обработки для каждого метода наQuietFoo а такжеLoudFoo, Расширение не является жизнеспособным решением, потому что оно нарушает всеэто контракт сLoudFoo это неQuietFoo.

В основном, учитываяFoo:

public interface Foo {
    void bar();
}

Как я могу сделатьQuietFoo воплощать в жизньFoo без изменения его источника, поэтому я не должен делать кастинг иinstanceof звонки везде в моем коде?

Ответы на вопрос(1)

Ваш ответ на вопрос