Skip to main content
 首页 » 编程设计

design-patterns之为什么使用查询对象设计模式

2024年11月01日33langtianya

我试图理解“查询对象设计模式”。我无法为它找到好的和简单的例子。有人可以帮助我了解这种设计模式的用途以及我们可以在什么问题上实现它吗?

请您参考如下方法:

Query 设计模式通常与 Repository 设计模式结合使用。

让我们举一个例子,然后我会给出一篇很好的文章来阅读。假设我们有一个数据库,用于存储有关客户及其订单等的信息。

然后我们创建一个初始存储库,如下所示:

class CustomerRepository() { 
    Customer GetById(int id) { // implementation } 
    void DeleteCustomer(int id) { // impl } 
    Customer GetCustomerWithOrder(int orderId); 
    Customer[] GetCustomersWithOrdersMoreThan(int numberOfOrders); 
} 

正如您所看到的,对于每个查询,我们在存储库中创建了一个方法,该方法非常适用于数量有限的查询,但是当我们有很多查询并且它们开始因大量组合而变得复杂时(例如让我购买客户超过 1000 并且住在纽约并且他们的信用额度小于 3000)那么我们最终会得到一长串方法,更糟糕的是,在我们不想要的存储库中以查询的形式泄漏一些业务逻辑即将发生。

因此,为了重构我们将存储库更改为这样的内容:
class CustomerRepository() { 
    Customer[] Get(Query query) { // implementation } 
    void DeleteCustomer(int id) { // impl } 
} 

如您所见,我们正在传递一个查询对象,该对象以对象的形式表示我们的查询,并且存储库有一个也是唯一的存储库来执行该查询并将结果返回给我们。

现在如何实现该查询对象以及如何构建它需要大量代码,所以在这一点上我将引导您转到这个 nice article .它是用 C# 编写的,但您会发现它非常有用,您也可以查看 Criteria API (Java) NHibernate 使用它来查看不同但相似的实现。