设计模式 - 如何在实际案例中使用它

时间:2012-04-02 15:29:58

标签: design-patterns

我有一些业务要求听起来像这样:
在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();
}
第二个问题:怎么做? :)

我想过使用抽象工厂或构建器模式,但我不知道哪种模式适合这种情况以及如何构建它?

有人可以帮我决定哪种方式更好吗?

2 个答案:

答案 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,但它具有相同的概念感。