2013-05-06 71 views
0

在Stackoverflow上有类似的场景,但他们并没有真正解决我的问题。 我目前正在做一些重构,并希望通过应用模式使代码更健壮,更灵活和更易读。这是任务:OOD:将工厂模式与策略模式结合使用

我有一个类,让我们说A类,它应用一些逻辑时,设置其成员之一。这个逻辑很容易发生变化,所以我想将其外部化。这是战略模式有用的地方。 此外,在某个阶段,我需要过滤A类对象的列表。过滤器逻辑也应该是可配置的,所以stragey模式在这项任务中也会很方便。 问题是:我如何将这些要求组合到面向对象的设计中?

我的想法到目前为止: - 使用工厂的类型为A的对象,它有两个策略对象:SettingMemberStrategy和FilterStrategy。如果具体工厂以单例实现,则在创建对象之前需要指定两个策略对象。 - 在A类的接口上有两个方法:setMember(value);布尔值filtered()。这些方法的确切实施取决于策略。但是,如果对象也包含策略的实例?

这种方法可能有效,但对于任务来说似乎有点过分,并且在美学上不太令人满意。 有人可以提示更好的解决方案吗? 非常感谢。

干杯,

马丁

public interface IA { 
    setMember(); 
    filter(); 
} 

public class A implements IA { 
    private String theMember = ""; 

    getMember() { return this.theMember; } 
    setMember(String input, otherParameters[]) { 
     // set value for member based on strategy and parameters 
    }   

    boolean filter(); 
    // returns yes/no based on whether this class should be filtered 
    // as per filter strategy 
} 


public class myFactory { 
    private FilterStrategy myFilterStrategy; 
    private MemberStrategy mySetMemberStrategy; 

    IA createObjectOfClassA() { 
     a = new A(mySetMemberStrategy, myFilterStrategy); 
    } 

    setFilterStrategy(FilterStrategy s) { this.myFilterStrategy = s } 

    setMemberStrategy(MemberStrategy s) { this.mySetMemberStrategy = s } 
} 
+0

怎么可能对象(例如A)如果它没有提及战略,则称为应用策略?你能提供一些代码吗? – 2013-05-06 14:17:11

+0

发布示例代码 – skjagini 2013-05-06 14:46:23

+0

好的,我可以尝试创建一些虚拟代码。 – user1156620 2013-05-07 07:59:36

回答

0

这个问题完全取决于你如何使用这些对象。我的直觉告诉我,在大多数情况下,你不需要工厂和战略模式 - 你会选择一个或另一个,从而简化你的代码。

例如,如果您要在工厂中创建对象A的子类,那么请消除可配置策略并将其烘焙到您的子类中。

但是,如果您不创建子类,只需要具有可配置策略的对象,然后消除工厂,并在需要时在其构造函数中使用适当的策略创建对象。

你也可以拥有这两者的组合,如果你例如基于输入创建对象,并使用一个工厂方法来给你一个适当的情况下,即

public A MyFactoryMethod(string typeToCreate){ 
     switch(typeToCreate) { 
      case "AbeforeB": 
       return new A(new FilterStrategyA(), new MemberStragegyB()); 
      case "allA": 
       return new A(new FilterA(), new MemberStrategyA()); 
      // etc. etc.   
     } 
}