java中的回调行为

时间:2013-11-29 21:46:50

标签: java design-patterns callback

我的问题更多的是用于我的实现的设计模式。我的代码编写如下 -

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

我不想将所有方法都放在界面中,因为我必须在所有服务中实现它们。我需要一种方法来实现我想要的成功方法。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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()

一样简单

答案 2 :(得分:0)

您可以尝试使用大多数通用Java类Object作为参数并使用varargs:

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

在实现中你必须弄清楚对象类型和参数的数量,但是你的函数会有一个干净的界面。

另一种方法是定义一个类,它包含您计划成功发送的所有参数,然后在内部实现的成功方法中获取您真正需要的参数。