Шаблон Java для изменения имени интерфейса API? - PullRequest
1 голос
/ 10 июня 2011

Есть ли какой-нибудь шаблон / решение, которое я могу использовать для достижения следующего:

Я использую API, интерфейс которого называется ApiInterface.
Интерфейс имеет 1 метод: void apiMethod(BaseType val);.

Теперь я хочу использовать эту функцию, но я хочу использовать свой собственный интерфейс, другое имя метода и подтип BaseType:

interface MyInterface {
  void myMethod(MyType val); 
}

MyType расширяет BaseType. myMethod должен просто вызвать apiMethod, с той лишь разницей, что он использует MyType.

Есть ли способ создать MyInterface такой, чтобы он был просто проходом к ApiInterface, но с использованием другого имени метода и моего собственного расширения BaseType? Мне удалось сделать это с помощью абстрактного класса, который расширяет ApiInterface, но я хочу использовать интерфейс, а не класс.

Ответы [ 3 ]

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

Вы можете попробовать шаблон проектирования адаптера. Это поможет вам.

0 голосов
/ 10 июня 2011

Примерно так:

public class ApiAdapter implements MyInterface {
  private final ApiInterface delegate;

  public ApiAdapter(ApiInterface delegate) {
    this.delegate = delegate;
  }

  public void myMethod(MyType value) {
    delegate.apiMethod(value);
  }
}

Теперь, если у вас есть код со ссылкой на экземпляр ApiInterface и вы хотите преобразовать его в экземпляр MyInterface, вы можете сделать что-то вродеэто:

ApiInterface instance = ...;
MyInterface adaptedInstance = new ApiAdapter(instance);

Теперь вы можете вручить adaptedInstance любому, кто нуждается в MyInterface

0 голосов
/ 10 июня 2011

Во-первых, интерфейс ничего не реализует. Таким образом, ваш ApiInterface должен был определить:

   void apiMethod(BaseType val);

и либо должен быть какой-то конкретный класс, реализующий этот метод, либо вы должны реализовать его самостоятельно.

Но кроме этого вам может понадобиться адаптер.

public interface ApiAdapter{
    void myMethod(MyType val);
}

public class ConcreteAdapter implements ApiAdapter{
     void myMethod(MyType val){
         ApiInterface api = new ConcreteApiClass();
         api.apiMethod(val);//should work since MyType extends BaseType
     }
}

Теперь в вашем коде вы можете объявлять объекты ConcreteAdapter и вызывать myMethod с помощью MyType без каких-либо ссылок на ApiInterface и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...