策略模式与不同参数

24 浏览
0 Comments

策略模式与不同参数

在使用策略模式时,我遇到了一个问题。我正在实现一个用于创建任务的服务。该服务还会解决该任务的负责人。通过使用策略模式来解决负责人的问题,因为有不同的解决方法。问题在于每个策略可能需要不同的参数来解决负责人。

例如:

interface ClerkResolver {
    String resolveClerk(String department);
}
class DefaultClerkResolver implements ClerkResolver {
    public String resolveClerk(String department) {
        // 一些操作
    }
}
class CountryClerkResolver implements ClerkResolver {
    public String resolveClerk(String department) {
        // 这里不需要部门名称,我需要的是国家。
    }
}

问题在于每个解析器可能依赖不同的参数来解决负责人。对我来说,这听起来像是我的代码中的设计问题。我也尝试使用一个类作为参数,以保存策略可能需要的所有值,例如:

class StrategyParameter {
   private String department;
   private String country;
   public String getDepartment() ...
}
interface ClerkResolver {
    String resolveClerk(StrategyParameter strategyParameter);
}

但是,老实说,我对这个解决方案并不满意,因为每当策略需要一个新的/不同的参数时,我都必须更改参数类。而且,策略的调用者必须设置所有参数,因为他不知道哪个策略将解决负责人,因此他必须提供所有参数(但这并不是太糟糕)。

再次强调,对我来说,这听起来像是我的代码中的设计问题,但我找不到更好的解决方案。

--- 编辑

这个解决方案的主要问题出现在创建任务时。任务服务的代码如下:

class TaskService {
    private List clerkResolvers;
    Task createTask(StrategyParamter ...) {
        // 一些操作
       for(ClerkResolver clerkResolver : clerkResolvers) {
          String clerk = clerkResolver.resolveClerk(StrategyParameter...)
          ...
       }
       // 一些其他操作
    }
}

如您所见,当使用TaskService时,调用者必须提供解决负责人所需的信息,即部门名称和/或国家,因为TaskService本身没有这些信息。

当需要创建任务时,调用者必须提供StrategyParameter,因为它们是解决负责人所必需的。再次强调,问题在于调用者没有所有的信息,比如他对国家没有了解,他只能设置部门名称。这就是为什么我在接口中添加了第二个方法来确保策略能够处理负责人的解决方案:

interface ClerkResolver {
    String resolveClerk(StrategyParameter strategyParameter);
    boolean canHandle(StrategyParameter strategyParameter);
}

尽管重复了一下,但这个解决方案对我来说并不合适。

所以,如果有人对这个问题有更好的解决方案,我将不胜感激。

感谢您的评论!

0