2013-11-29 5 views
0

Мой вопрос больше касается шаблона проектирования, используемого для моей реализации. У меня есть код, написанный следующим образом -поведение обратного вызова в java

X-Service.java

handler.setListeners(new HttpResponseHandler.conListers() { 

    @Override 
    public void success() { 

    } 

}); 

HttpResponseHandler

protected conListers conListener; 
public interface conListers { 
    public void success(); 
} 

public void conListers(conListers listener) { 
    this.conListers = listener; 
} 

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

public void success(String x); 
public void success(HashMap y, Integer z); 

Я не хочу, чтобы положить все методы в интерфейсе, так как у меня будет реализовать их во всех услугах. Мне нужен способ, которым я могу просто реализовать метод успеха, который я хочу.

+1

может работать с дженериков в зависимости от вашего USECASE. – zapl

+0

Мне также может потребоваться передать несколько параметров ... – Fox

+0

Возможно, вам понадобится несколько интерфейсов: – zapl

ответ

1

Вы можете определить интерфейс с помощью общего объявления типа:

public interface conListers<E> { 
    public void success(E value); 
} 

В качестве альтернативы, если вам нужно переменное число аргументов одного и того же типа, то вы можете использовать:

public interface conListers<E> { 
    public void success(E... value); 
} 

Если вы требуется фиксированное количество аргументов, тогда вы можете просто проверить длину аргумента value в определении success() в классе реализации.

Однако я не могу придумать ни одного шаблона, который вы можете использовать, чтобы разрешить success() использовать переменное фиксированное количество разных типизированных аргументов, если вы не используете Object, но затем приносят свои собственные проблемы (например, нужно ввести все аргументы в реализующем классе):

public interface conListers { 
    public void success(Object... value); 
} 
+0

Я только что отредактировал мое сообщение .. Мне, возможно, придется передать несколько параметров тоже .. – Fox

0

вы можете попробовать наиболее общий класс Java Object в качестве параметра и использование переменной длиной:

public interface conListers { 
    public void success(Object... arguments); 
} 

внутри реализации вы должны выяснить объективистский t и количество аргументов, но у вас будет чистый интерфейс для ваших функций.

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

1

Вы можете использовать шаблон команды в этом сценарии, в основном команда conListener будет вашей командой. В качестве ваших услуг у вас будет столько реализаций conListeners.

Пример:

public class conListenersA implements conListener{ 
    protected Service serviceA; 
    public void success(){ 
     serviceA.success(arg1);//the method has arguments 
    } 
} 

public class conListenersB implements conListener{ 
    protected Service serviceB; 
    public void success(){ 
     serviceB.success(arg1,arg2);//the method has 2 arguments 
    } 
} 

Преимущество заключается в том, что всякий раз, когда вам нужно выполнить conListener вызове будет «однородным», так просто, как conListener.success()

+0

Очень элегантное решение! ИМХО, он кажется самым привлекательным среди других. –

Смежные вопросы