寻找有关用 Java 设计某些代码的指导。
目前我有这样的东西....
@Service
class SomeService {
@Autowired
private FilterSoldOut filterSoldOut;
@Autowired
private FilterMinPriceThreshold filterMinPriceThreshold;
public List<Product> getProducts() {
List<Product> products = //...code to get some products
// Returns list of in-stock products
products = filterSoldOut.doFilter(products);
// Returns list of products above min price
products = filterMinPriceThreshold.doFilter(minPrice, products);
return products;
}
}
我希望能够做的是使用 doFilter 方法创建一个 Filter 接口(interface),然后在 SomeService 中创建一个 List 过滤器,它由 Spring Autowiring 。然后在 getProducts 方法中我可以迭代过滤器列表并调用 doFilter。通过这种方式,我将来可以创建实现 Filter 接口(interface)的新类,并通过 Spring 配置将它们添加到列表中,并在无需更改代码的情况下应用新的过滤器。
但是,问题在于 doFilter 方法的参数可能不同。我读过命令模式和访问者模式,但它们似乎不太符合要求。
任何人都可以提出一个好的模式来实现我所描述的吗?
谢谢。
最佳答案
有很多方法可以做到这一点。有些很复杂,有些很简单。最简单的一种是使用 varargs
或 Object
的数组元素。这里的问题是,您必须将每个 objetc 转换为正确的类型才能使用它们,如果有多种类型且顺序未知,这可能会有点棘手。
另一种选择是使用 Map<String,Object>
(如果需要,您可以将其包装在自己的类中,例如 FilterParams
)根据名称存储参数,然后您可以获取它们并相应地转换它们。
编辑
考虑到参数在运行时会有所不同,您需要有人“消息灵通”了解当前配置。
不是模式明智的,但我宁愿保持简单而不使用太多花哨的名字。介绍一个FilterConfigurator
怎么样?有一个简单的重载方法 configure
接收特定过滤器并根据其类型配置它?此配置器是知情实体,它知道这些参数的当前值。
目标是摆脱Service
从配置过滤器的责任。
此外,如果您创建自己的 Filter
类,您将能够实现单个 doFilter
您无需更改即可调用。
还有另一个想法......它涉及一个FilterFactory
创建 和 初始化过滤器,因此从头开始配置过滤器 100%。这家工厂完全可以依靠FilterConfigurer
或者自己做。
关于java - Java中具有不同参数的接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062023/