假设我来的课是这样的
class Product {
double Price;
String name;
String category;
}
我有一个面向客户端的 API,允许用户根据名称、评级或价格过滤我的对象列表。这些都是通过这样的策略模式来实现的
interface IFilterStrategy {
boolean apply(Product product);
}
class NameMatchStrategy implements IFilterStrategy {
String name;
public NameMatchStrategy(String name) {
this.name = name;
}
boolean apply(Product product) {
return product.getName().equals(name);
}
}
class PriceMatchStrategy implements IFilterStrategy {
double minVal;
double maxVal;
public StringMatchStrategy(double minVal, double maxVal) {
this.minVal = minVal;
this.maxVal = maxVal;
}
boolean apply(Product product) {
return product.getPrice() >= minVal && product.getPrice() <= maxVal;
}
}
我的问题是,如果我想添加一个新策略,比如说只匹配名称的前缀,该怎么办。因此,也许用户传递“
iph
”,我应该能够找到一个名为“iphone
”的产品名称并将其与之匹配。我知道我可以创建另一个 NamePrefixMatchStrategy
,但如果将来我想扩展这个 Prefix
策略来说,Category
呢?就像用户可以传入“ph
”一样,我应该找到类别“phone
”。
强力解决方案就是创建一个
CategoryPrefixMatchStrategy
,但我的策略数量很快就会变得难以维护。
解决这个问题的最佳设计模式是什么?我应该创建一个通用的 StringMatchStrategy 或其他东西,我只是不确定如何将其合并到我当前的设计中。
这是一个见仁见智的问题,但这些策略并不是很广泛,所以你不妨在工厂方法中创建它们,
class NameMatchingStrategies {
public static IFilterStrategy exactMatch(String toMatch) {
return product -> product.getName().equals(toMatch);
}
public static IFilterStrategy containsMatch(String toContain) {
return product -> product.getName().contains(toContain);
}
}