Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的回调行为_Java_Design Patterns_Callback - Fatal编程技术网

java中的回调行为

java中的回调行为,java,design-patterns,callback,Java,Design Patterns,Callback,我的问题更多地是关于用于实现的设计模式。我的代码编写如下- X-Service.java handler.setListeners(new HttpResponseHandler.conListers() { @Override public void success() { } }); HttpResponseHandler protected conListers conListener; public interface conListers {

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

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;
}
所以现在我的问题是,如果我只有一种成功函数,我可以使用这种技术。更清楚地说,我有多个服务,其中success方法具有不同的签名,如--


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

您可以使用泛型类型声明定义接口:

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

您可以尝试使用最通用的Java类
对象
作为参数,并使用varargs:

public interface conListers {
    public void success(Object... arguments);
}
在实现中,您必须找出对象类型和参数的数量,但您的函数将有一个干净的接口


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

在这种情况下,您可以使用命令模式,基本上,
conListener
将是您的命令。您将拥有与您的服务一样多的ConListener实现

例如:

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()一样简单

可能会根据您的用例使用泛型。我还可能需要传递多个参数…您可能需要多个接口:)@Fox您可以始终将多个参数包装到单个对象中。这与.NET处理
EventHandler
委托的功能非常相似。非常优雅的解决方案!嗯,它似乎是最活跃的。
public interface conListers {
    public void success(Object... value);
}
public interface conListers {
    public void success(Object... arguments);
}
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
    }
}