过滤对象的策略模式,如何组合?

问题描述 投票:0回答:1

假设我来的课是这样的

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 或其他东西,我只是不确定如何将其合并到我当前的设计中。

java filter design-patterns strategy-pattern
1个回答
0
投票

这是一个见仁见智的问题,但这些策略并不是很广泛,所以你不妨在工厂方法中创建它们,

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);
 }
}
© www.soinside.com 2019 - 2024. All rights reserved.