嵌套策略类 - 命名约定和样式?

时间:2013-09-11 15:14:26

标签: java design-patterns

我有一个类,它使用策略模式根据会话设置格式化名称:

String outputName = session.getNameFormatStrategy().format(name);

现在我发现我想要配置对象,以便从会话(如上所述)或其他来源获取名称格式化策略。看起来这是另一个非常适合战略模式:

String outputName = nameFormatStrategyStrategy.getNameFormatStrategy().format(name);

nameFormatStrategyStrategy可能位于RetrieveNameFormatStrategyFromSessionStrategyStaticNameFormatStrategyStrategyRetrieveNameFormatStrategyFromSystemConfigStrategy

分层结构和分层抽象是好的,但我真的不喜欢NameFormatStrategyStrategy,当然,更多层可能会变得更糟。

我可以用更好的命名方式解决这个问题吗?还是用另一种模式?

2 个答案:

答案 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隐藏了类的嵌套。

除了原来的两个策略StandardNameFormatStrategyFancyNameFormatStrategy之外,我添加了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对象,因此调用者不需要知道该额外的间接级别。

非常满意。我最终删除了来自调用者的代码,因为它不再需要了,最终导致了不再需要的导入 - 总是一个温暖而模糊的标志。