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

标签 design-patterns

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

最佳答案

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 使用它来查看不同但相似的实现。

关于design-patterns - 为什么使用查询对象设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17831623/

相关文章:

java - MVC - 将 Controller 和模型放在同一个类中是否是一种习惯

iphone - 使用 CLLocationManager 的自定义位置管理器类

c++ - 使用工厂模式按名称实例化类

oop - 缺陷 : Constructor does Real Work

c++ - 使用模板实现多态

c# - C# 的设计模式和基于字符串参数调用不同的方法

java - 如何在Swing应用程序中实现JProgressBar?

c# - FileInfo 的空对象模式

java - 在 Java Scanner 中分割数据文件

java - 使空对象不可变的任何标准模式或策略