Java 索引服务设计-同步/异步

Java 索引服务设计-同步/异步,java,interface,indexing,Java,Interface,Indexing,我有一个索引项目的要求。此服务应运行同步或异步 我开始设计一个界面 public interface IndexService{ public void index(); } 和两个实现,一个用于异步索引: public class AsyncIndex implements IndexService { public void index(){ //... Creates a Thread and index the items } } 另一个是

我有一个索引项目的要求。此服务应运行同步或异步

我开始设计一个界面

public interface IndexService{
    public void index();
}
和两个实现,一个用于异步索引:

public class AsyncIndex implements IndexService {

    public void index(){
        //... Creates a Thread and index the items
    }

}
另一个是同步索引

public class SyncIndex implements IndexService {

    public void index(){
        //... Creates a Thread and index the items
    }

}
但现在有另一种设计是使用IndexService,它有一个标志作为异步服务或同步服务执行:

public interface IndexService{
    public void index(int mode);
}
现在,实现将知道如何基于该标志运行

我知道第一种设计更好,但我需要正反两方面来解释原因。

我两者都说

假设,您计划使用第二种方法。您的实施可能如下所示:

public SyncOrAsyncIndex implements IndexService {
public void index(int mode) {
    if(mode == 0) {
        //sync processing code
    } else if (mode == 1) {
        //async procesisng code
    }

}
也就是说,您要在这个索引方法或SyncOrAsyncIndex类中编写所有实现吗。这最终可能会变得难以管理。 因此,索引方法可能会这样结束:

public void index(int mode) {
    if(mode == 0) {
        new SyncIndex().index(); //for example
    } else if (mode == ) {
        new AsyncIndex().index(); //for example
    }
}
假设您决定支持第三种模式。想象一下index方法或SyncOrAsyncIndex类的困境。因此,需要第一种方法

因此,根据“代码到接口”策略,建议使用第一种方法。如果调用者知道索引的类型,他们可以实例化特定类型并使用它


否则,与第一种方法一起,第二种方法可能需要作为工厂或策略,根据传递的参数计算要使用的索引类型。然后调用程序将通过SyncOrAsyncIndex使用SyncIndex或AsyncIndex

1-代码更干净AsyncInex类只有与异步调用相关的代码,而syncIndex将有自己的代码。 2-你可以避免其他情况,如果

...
public void runService(IndexService service) {
     service.index()
}

// some where in your code
runService(new AsyncIndex());
// or
runService(new SyncIndex());
当您使用接口“IndexService”时,您总是可以在不更改客户端代码的情况下更改实现。 特别是,如果您使用的是DI框架,那么您就可以享受它的乐趣;)

这对于不允许客户端代码了解实现非常重要。假设您正在索引一个数据库。 当数据较大时,您希望执行异步索引,当数据较小时,您希望执行同步索引。 调用方应该不知道调用索引的方式。这样,您可以在不同的情况下使用不同的策略,而无需更改调用方代码。如果你采取第二种方法,你必须做一些额外的工作