我有一个类,它使用策略模式根据会话设置格式化名称:
String outputName = session.getNameFormatStrategy().format(name);
现在我发现我想要配置对象,以便从会话(如上所述)或其他来源获取名称格式化策略。看起来这是另一个非常适合战略模式:
String outputName = nameFormatStrategyStrategy.getNameFormatStrategy().format(name);
nameFormatStrategyStrategy可能位于RetrieveNameFormatStrategyFromSessionStrategy
,StaticNameFormatStrategyStrategy
,RetrieveNameFormatStrategyFromSystemConfigStrategy
。
分层结构和分层抽象是好的,但我真的不喜欢NameFormatStrategyStrategy
,当然,更多层可能会变得更糟。
我可以用更好的命名方式解决这个问题吗?还是用另一种模式?
答案 0 :(得分:4)
Strategy
Strategy
似乎有点过分了。看起来你有一个Strategy
然后有三种方法被定义 - 考虑使用继承来从父类Strategy
子类化为三种变体而不是使用嵌套模型。
简而言之,如果您需要管理重复代码,请在这些情况下支持继承 - 这将确保一切都保持可扩展性,而不会引入命名噩梦。
在我看来,从会话格式化名称是一个不应该嵌套的策略。同样,对于其他两个列出的案例。
编辑:
再考虑一下,你可以做类似以下的事情:
public class NameFormatter {
public void setStrategy(NameFormatStrategy strategy) {
// Set the strategy.
}
public String format(String name) {
// Format according to set strategy.
}
}
}
这样,你可以想象完全摆脱嵌套,并有一个格式化类,让自己配置一个策略(来自会话等)
答案 1 :(得分:0)
以为我会更新我最终做的事情。
我使用策略API隐藏了类的嵌套。
除了原来的两个策略StandardNameFormatStrategy
和FancyNameFormatStrategy
之外,我添加了SessionConfiguredNameFormatStrategy
这样的内容:
public class SessionConfiguredNameFormatStrategy {
private Session session;
public SessionConfiguredNameFormatStrategy(Session session) {
this.session = session;
}
public String format(String name) {
return session.getNameFormatStrategy().format(name);
}
}
我正在将“选择哪个策略”位折叠成一个Strategy对象,因此调用者不需要知道该额外的间接级别。
非常满意。我最终删除了来自调用者的代码,因为它不再需要了,最终导致了不再需要的导入 - 总是一个温暖而模糊的标志。