java - Java中具有不同参数的接口(interface)方法

标签 java spring design-patterns

寻找有关用 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 方法的参数可能不同。我读过命令模式和访问者模式,但它们似乎不太符合要求。

任何人都可以提出一个好的模式来实现我所描述的吗?

谢谢。

最佳答案

有很多方法可以做到这一点。有些很复杂,有些很简单。最简单的一种是使用 varargsObject 的数组元素。这里的问题是,您必须将每个 objetc 转换为正确的类型才能使用它们,如果有多种类型且顺序未知,这可能会有点棘手。

另一种选择是使用 Map<String,Object> (如果需要,您可以将其包装在自己的类中,例如 FilterParams )根据名称存储参数,然后您可以获取它们并相应地转换它们。


编辑

考虑到参数在运行时会有所不同,您需要有人“消息灵通”了解当前配置。

不是模式明智的,但我宁愿保持简单而不使用太多花哨的名字。介绍一个FilterConfigurator怎么样?有一个简单的重载方法 configure接收特定过滤器并根据其类型配置它?此配置器是知情实体,它知道这些参数的当前值。

目标是摆脱Service从配置过滤器的责任。

此外,如果您创建自己的 Filter类,您将能够实现单个 doFilter您无需更改即可调用。

还有另一个想法......它涉及一个FilterFactory创建 初始化过滤器,因此从头开始配置过滤器 100%。这家工厂完全可以依靠FilterConfigurer或者自己做。

关于java - Java中具有不同参数的接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062023/

相关文章:

java - Spring Boot 执行器 MySQL 数据库健康检查

c++ - 依赖图的设计模式

java - 如何将插件项目模板集成到现有的 eclipse 项目中?

java - 修改自定义注解的参数值

java - 在 Singleton 类中 Autowiring Spring bean

java - Wicket 通用组件设计模式

c++ - 在初始化列表中初始化许多对象成员变量

java - 委托(delegate)给 Servlet 的 Spring MVC Controller

java - 从 EditorReference 获取源文件?

java - 请求 : Spring configured CXF ws client -- replacing hardcoded variables like 'address'