1

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

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

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

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

nameFormatStrategyStrategy 可能在哪里,例如RetrieveNameFormatStrategyFromSessionStrategy, .StaticNameFormatStrategyStrategyRetrieveNameFormatStrategyFromSystemConfigStrategy

分层结构和分层抽象很好,但我真的不喜欢NameFormatStrategyStrategy,当然随着层的增加它会变得更糟。

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

4

2 回答 2

4

拥有 a Strategyfor aStrategy似乎有点过头了。似乎您有一个Strategy然后具有三种定义方式 - 考虑使用继承以便从父级子类化为三个变体,Strategy而不是使用嵌套模型。

简而言之,如果您需要管理重复代码,请在这些情况下支持继承——这将确保一切都保持可扩展性,而不会引入命名噩梦。

在我看来,从会话中格式化名称是一种不应该嵌套的单一策略。其他两个列出的案例也是如此。

编辑:

再想一想,您可以执行以下操作:

public class NameFormatter {

    public void setStrategy(NameFormatStrategy strategy) {
        // Set the strategy.
    }

    public String format(String name) {
        // Format according to set strategy.
    }

    }
}

这样,您可以想象完全摆脱嵌套并拥有一个格式化类,它可以使用其中一种策略(来自会话等)进行配置

于 2013-09-11T16:08:16.677 回答
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 对象中,所以调用者不需要知道那个额外的间接级别。

很满意。我最终从调用者那里删除了代码,因为不再需要它,并最终得到了不再需要的导入——总是一个温暖而模糊的标志。

于 2013-10-09T16:09:35.823 回答