Topic: 【转贴】使用Specification模式简化查找操作

  Print this page

1.【转贴】使用Specification模式简化查找操作 Copy to clipboard
Posted by: yamakasy
Posted on: 2003-09-27 09:07

使用Specification模式简化查找操作

[主要参考资料:Refactoring to Patterns]之
Replace Conditional Searches with Specification

实际编程中,往往会根据各种条件查找某个Entity,
比如ProductFinder…有各种查找方法


public List byID(String productID)…
public List byColor(Color colorOfProductToFind)…
public List byPrice(float priceLimit)…
public List bySize(int sizeToFind)…
public List belowPrice(float price)…


随着时间增长,各种查询可能呈指数膨胀:
Over time, the combination of ways to find products grows:
ProductFinder…

 
public List byColorAndBelowPrice(Color color, float price)…
public List byColorSizeAndBelowPrice(Color color, int size, float price)…
public List byColorAndAbovePrice(Color color, float price)…


最终你的系统会充满了许多Finder方法,很难维护。
Specification模式就是解决这个问题的。
Speicification建议把每个查找条件(search criterion)抽出来变成类,
而Client可以任意组合Specification获得适合的查找条件.
变为


public static ProductSpecification byColor(final Color colorOfProductToFind) {
return new ProductSpecification() {
public boolean isSatisfiedBy(Product product) {
return product.getColor() == colorOfProductToFind;
}
};
}
byColor(...) : ProductSpecification
bySize(...) : ProductSpecification
byPrice(...) : ProductSpecification
below Price(...) :ProductSpecification
abovePrice(...) : ProductSpecification


然后通过组合

 
ProductSpecification productSpecification =
ProductSpecification.below Price(9.00f).and(
ProductSpecification.not(
ProductSpecification.byColor(Color.white)));
List foundProducts =
repository.selectBy(productSpecification);


selectBy函数为:


public List selectBy(
ProductSpecification productSpecification) {
List foundProducts = new ArrayList();
Iterator products = iterator();
w hile (products.hasNext()) {
Product product = (Product)products.next();
if (productSpecification.isSatisfiedBy(product))
foundProducts.add(product);
}
return foundProducts;}


(注:其实Patterns of Enterprise Application Architecture一书的
Query Object 一章也有讲到这种形式的pattern的,可以参考,
而且Hibernate的新特性也出现这种组合Search Critiea的,现在没时间研究
希望有机会的话也会去研究一下Hibernate。)
该书中举的例子查找物体的Repository是内存中的Collection,
附件是根据Specification的精神结合Visitor模式来拼SQL的.
希望有兴趣的人共同研究,因为现在O/R mapping技术肯定也是很重要的一块。
目前只作了Where语句部分,对于多表可以给出Specification中定义的
所有条件,不过表连接条件没有定义过,所以不会在SQL中出现。
还有要查询的Fields我现在还没加,只是简单的SELECT *,

specification.rar (5.19k)

2.Re:【转贴】使用Specification模式简化查找操作 [Re: yamakasy] Copy to clipboard
Posted by: ajinjin
Posted on: 2003-09-27 14:24

阅,不错

3.Re:【转贴】使用Specification模式简化查找操作 [Re: yamakasy] Copy to clipboard
Posted by: yuantiou
Posted on: 2003-09-30 15:07

有refactoring之前的代码么?

如果有,可以让我看看么?


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923