Stackoverflow上已经存在类似场景的一些问题,但它们并没有真正解决我的问题。 我目前正在进行一些重构,并希望通过应用模式使代码更加健壮,灵活和可读。这是任务:
我有一个类,比如A类,它在设置其中一个成员时会应用一些逻辑。这个逻辑很容易改变,所以我想把它外化。这是战略模式有用的地方。 此外,在某些阶段,我需要过滤A类对象列表。过滤器逻辑也应该是可配置的,因此stragey模式在此任务中也很方便。 问题是:如何将这些要求结合到面向对象的设计中?
到目前为止我的想法: - 将工厂用于类型为A的对象,该对象具有两个策略对象:SettingMemberStrategy和FilterStrategy。如果具体工厂实现为单例,则需要在创建对象之前指定两个策略对象。 - 在A类接口上有两个方法:setMember(value); boolean 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 :(得分: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.
}
}