Как называется этот шаблон? (ответ: удаленный прокси) - PullRequest
2 голосов
/ 20 июня 2011

Рассмотрим класс OriginalClass, который может или не может быть доступен во время выполнения. OriginalClass имеет метод doSomething, который должен выполняться, если доступен его класс.

Способ решения этой проблемы - создание класса, который также имеет метод doSomething, который вызывает OriginalClass.doSomething с использованием отражения. Примерно так:

public class CompatibilityClass {

    private static Method originalClass_doSomething = null;

    static {
        initCompatibility();
    };

    private static void initCompatibility() {
        try {
            originalClass_doSomething = Class.forName("originalClass").getMethod("doSomething", new Class[] {});
        } catch (NoSuchMethodException nsme) {
        } catch (SecurityException se) {
        } catch (ClassNotFoundException cnfe) {}
    }

    public static void doSomething() {
        if (originalClass_doSomething != null) {
            try {
                originalClass_doSomething.invoke(null, new Object[]{});
            } catch (Exception e) {}
        }
    }

}

Как называется применяемый здесь шаблон дизайна? Я подозреваю, что это либо Адаптер , Мост , Фасад или Прокси , но я не уверен, какой именно.

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Пахнет мне как прокси. Но разве вам не лучше использовать API Java по умолчанию Dynamic Proxy API ?

Определение прокси:

Прокси заставляет вызов метода объекта происходят косвенно через прокси объект, который выступает в качестве суррогата или делегировать для базового объекта быть прокси Прокси-объекты обычно объявляется так, что клиент объекты не имеют никаких признаков того, что они есть экземпляр прокси-объекта.

2 голосов
/ 20 июня 2011

Я бы сказал, что это шаблон прокси .

Вы создали прокси-класс, который оборачивает кровавые отражения и делегирует вызов метода другому объекту.

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

Ваш шаблон очень похож на выполнение какого-либо вызова метода по сети.

1 голос
/ 20 июня 2011

Простое объяснение:

  • Адаптер : если у вас есть два класса (A и B), которые семантически эквивалентны / похожи, но имеют разные интерфейсы. Адаптер реализует интерфейс A, но делегирует его B или наоборот, поэтому A и B могут использоваться взаимозаменяемо
  • Мост - обычно используется с целым деревом наследования (хотя я никогда не использовал его)
  • Фасад - скрыть сложность одного или нескольких классов за более простым интерфейсом
  • Прокси - тот же интерфейс, что и у целевого объекта, делегируемого ему, обычно используется для отложенной загрузки и отсоединения от цели.

Итак, ваш пример кода выглядит как Proxy .

...