我有一些业务要求听起来像这样:
在HR信息类型中找到符合标准的数据(......列出的标准......),
对于每个找到的数据(记录),使用所需的文本向给定的收件人发送电子邮件。
目前我已经找到了几套标准来查找具体数据,但我知道将来会有另外一套。
我决定构建一个解决方案,其中每组消息的标准和设置都是一个类 - 一个SearchAgent或者其他东西:
public abstract AbstractSearchAgent {
public run(){...}
public get_results() {...}
public send_info() {...}
}
第一个问题:这个概念是否正确?
我还想设计应用程序,主应用程序将实现一次。当我得到搜索数据的新标准时,我只添加另一个子类,其余的将是相同的:
public class myApp {
private AbstractSearchAgent searchagent;
public static void main() {
//for each existing implementation of abstractSearchAgent
//get instance into searchagent
//and execute its methods:
// e.g.
searchagent->run();
searchagent->send_info();
//
// if i wanted to do something else with the result
result = searchagent->get_results();
}
第二个问题:怎么做? :)
我想过使用抽象工厂或构建器模式,但我不知道哪种模式适合这种情况以及如何构建它?
有人可以帮我决定哪种方式更好吗?
答案 0 :(得分:3)
基本上这听起来像Strategy,完全可用于此类工作。您可以使用Factory创建所需的搜索代理。
为了提高解决方案的长期可维护性,您可以考虑将搜索代理实施为Composites基本标准,从而使个别标准更具可重用性。当搜索条件可以是复杂的逻辑表达式时,这是最好的,特别是如果这些包括NOT / OR运算符,例如“名称不以'M'开头且(年龄小于30或年龄大于50)”。作为Composite层次结构的实现可能如下所示:
AndCriteria
NotCriteria
NameCriteria
OrCriteria
AgeCriteria
AgeCriteria
另一种选择是Decorator。如果搜索条件可以以线性方式执行,例如“名称以'M'开头且年龄小于30且性别为女性,则这是足够的。这可以作为一系列装饰器实现,如下所示:
NameFilter -> AgeFilter -> GenderFilter
答案 1 :(得分:0)
另请参阅规范(http://en.wikipedia.org/wiki/Specification_pattern)。它补充了彼得的答案。
规范仍然使用策略和复合,但它专门针对您尝试解决的问题。
我已经好几次使用它了。我甚至在我的规范中编写了一个小的特定领域语言(使用Interpreter),因此我可以通过规范语言组装规范组合,而不是在代码中构建它们。虽然我的语言看起来不像SQL,但它具有相同的概念感。