Java 适当的设计

Java 适当的设计,java,design-patterns,Java,Design Patterns,我有一个应用程序,它对数据库执行多个查询(query1、query2、query3),检索数据,然后发布数据 我设计它的方式是: a。拥有一个DB类,它封装了连接、查询执行、将resultset转换为POJO b。知道如何发布pojo的publisher类 c。一种控制器,它在开始时执行A,然后将输出提供给b public void start(){ List<DataPojo> pojoList = db.executeAndRetrieveResult(); fo

我有一个应用程序,它对数据库执行多个查询(query1、query2、query3),检索数据,然后发布数据

我设计它的方式是:

a。拥有一个DB类,它封装了连接、查询执行、将resultset转换为POJO

b。知道如何发布pojo的publisher类

c。一种控制器,它在开始时执行A,然后将输出提供给b

public void start(){
    List<DataPojo> pojoList = db.executeAndRetrieveResult();
    for (DataPojo p : pojoList){
       publisher.publish(p);
    }
}
应用程序的使用非常简单,因此很好

但现在我需要做一个改变,从查询1中获取数据, 结合query2中的数据,然后发布它

以前,控制器是同质的。他们之间的区别 封装在它们执行的查询中(使用Db类)

但是,现在我需要知道哪个控制器正在执行哪个查询,这样我就知道了 从何处获取query1和query2的输出

是一种设计模式,我可以用来让Controller1和Controller2交互,同时保持它们相对松散的耦合


干杯

在这里人们通常做的事情是将应用程序划分为多个层。“底层”层(或最靠近数据库的层)只是与数据库交互并处理简单的数据库实体。如果这还不够的话,通常会有一个“业务层”,您可以在其中放置用于组合db实体的逻辑,包装从原子db实体组合构建的对象,等等

前端,不管它是什么,都与业务层交互。要点是避免将业务逻辑(db实体将如何组合)与db逻辑(获取和设置单个db实体的值)混合在一起


作为一种模式,您可以在诸如“3层”或“N层”设计之类的标题下找到对此的讨论。

这里人们通常做的事情是将应用程序划分为多个层。“底层”层(或最靠近数据库的层)只是与数据库交互并处理简单的数据库实体。如果这还不够的话,通常会有一个“业务层”,您可以在其中放置用于组合db实体的逻辑,包装从原子db实体组合构建的对象,等等

前端,不管它是什么,都与业务层交互。要点是避免将业务逻辑(db实体将如何组合)与db逻辑(获取和设置单个db实体的值)混合在一起


作为一种模式,您可以在“3层”或“N层”设计等标题下找到对此的讨论。

我将为您的查询创建一个包装器接口,类似于QueryExecutor,它有两个实现。一个simpleQueryExecutory,它只执行一个查询,就像现在一样,还有一个MultiQueryExecutory或LinkedQueryExeutor(或者一些类似的,你知道的),它接受两个相关的查询

让您的MultiQueryExecutor类执行这两个查询,然后在返回现在组合的已发布数据之前执行查询后处理逻辑


这也为以后的各种灵活查询执行做好了准备,比如StopOnFirstResultsMultiQueryExecutor,您可以向它提供一个查询列表,但它将停止并发布第一个发现>0结果的查询的结果。这只是我脑海中的一个例子,但希望它能让人明白这一点。

我会为您的查询创建一个包装器接口,比如QueryExecutor,它有两个实现。一个simpleQueryExecutory,它只执行一个查询,就像现在一样,还有一个MultiQueryExecutory或LinkedQueryExeutor(或者一些类似的,你知道的),它接受两个相关的查询

让您的MultiQueryExecutor类执行这两个查询,然后在返回现在组合的已发布数据之前执行查询后处理逻辑

这也为以后的各种灵活查询执行做好了准备,比如StopOnFirstResultsMultiQueryExecutor,您可以向它提供一个查询列表,但它将停止并发布第一个发现>0结果的查询的结果。这只是我脑海中的一个例子,但希望它能让我明白这一点

public void start(){
   for (Controller c : controllerList){
       c.start();
   }
}