我有一个能够拨打4个不同端点的api客户端。我遇到了一个问题,我试图使其尽可能可配置,因为每个api调用方法都独立于另一个。所以,我想保留它们可以被称为灵活的顺序。这就是我的意思:
public class APICaller () {
public void endpointA () {...
}
public void endpointB () {...
}
public void endpointC () {...
}
public void endpointD () {...
}
}
我尝试通过传入一个Endpoint枚举数组(A,B,C,D)然后遍历数组内容并使用switch语句调用相关方法来尝试这样做:
for (Endpoint end : passedInArrayOfOrdering) {
switch(end) {
case A:
endpointA();
...
}
}
我的上述尝试对我来说似乎有点脏。是否存在允许我配置进行这些端点调用的顺序的现有模式?
答案 0 :(得分:1)
您可以定义用于拨打电话的界面
public interface Caller
{ void callSomething(APICaller ac); }
然后定义实现
public class CallA implements Caller
{
public void callSomething(APICaller ac)
{
ac.endpointA()
}
}
然后传递CallA实例等对象而不是Endpoint枚举,因此您不需要使用switch()语句。
答案 1 :(得分:1)
您正在使用枚举类型来切换执行的逻辑,这意味着逻辑取决于类型 - 因此在类型上定义它。使Endpoint
成为一个接口并创建特定的端点。 E.g。
public interface Endpoint {
public void call();
}
实施,例如
public class EndpointA implements Endpoint {
public void call(){
// endpoint a specific code
}
}
您可以避免切换
for (Endpoint end : passedInArrayOfOrdering) {
end.call()
}
PS:每当您使用某种类型的开关(例如使用枚举)时,您将根据类型解析要手动执行的代码。 JVM可以做得更好。它被命名为动态调度。从OO的角度来看,它只是多态性。
前段时间我写了一篇关于打字机的博客,并讨论了利弊。见https://www.link-intersystems.com/blog/2015/12/03/enums-as-type-discriminator-anti-pattern/
答案 2 :(得分:1)
这里没有涉及任何特定模式 - 充其量,人们可以将其视为Command Pattern的一个实例。幸运的是,Java 8已经包含了您需要处理的所有内容:您可以使用Method References存储要调用的方法,然后遍历列表:
import java.util.Arrays;
import java.util.List;
public class ApiCallerExample {
public static void main(String[] args) {
ApiCaller a = new ApiCaller();
List<Runnable> commands = Arrays.asList(
a::endpointB,
a::endpointA,
a::endpointD,
a::endpointC,
a::endpointA,
a::endpointB);
commands.forEach(Runnable::run); // Prints "BADCAB"
}
}
class ApiCaller {
public void endpointA () { System.out.print("A"); }
public void endpointB () { System.out.print("B"); }
public void endpointC () { System.out.print("C"); }
public void endpointD () { System.out.print("D"); }
}
请注意,此处方法的类型为Runnable
,因为它们是无参数的方法,不会返回任何内容。如果你的方法需要参数(或返回一些东西),那么你可以使用适当的functional interface或&#34; pin&#34;您在调用站点的特定创新的方法参数:
Runnable runnable0 = () -> apiCaller.endpointA(argument0, argument1);
commands.add(runnable0);
答案 3 :(得分:0)
public class EndPoint {
public void call() {
// process endpoint
}
}
现在让每个端点的内容/数据区分一个端点和另一个端点。例如,如果它们是几何点,则它们的坐标是什么。不需要创建像endpointA,endpointB等方法。如果你有数百个点的情况怎么办?你会创建数百个方法吗?没有。
...
for (Endpoint end : passedInArrayOfOrdering) {
end.call();
}