配置方法执行的顺序

时间:2016-05-09 04:12:28

标签: java algorithm design-patterns

我有一个能够拨打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();
        ...
    }
}

我的上述尝试对我来说似乎有点脏。是否存在允许我配置进行这些端点调用的顺序的现有模式?

4 个答案:

答案 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();
}