学习策略模式我想知道这是否适用于我的代码的一部分。
假设有一个名为 UserService 的类
class UserService {
... some fields
public void execute(String orderValue) {
... some business logic
User user = ... // somehow received user here
... some more business logic
// now i need to initialize an order
Order order = initializeOrder(orderValue, user)
... business logic continues here
}
private Order initializeOrder(String orderValue, User user) {
if (orderValue != null) {
... initialize order using String value
} else {
... initialize order using user argument
}
}
}
正如您所看到的,有一个名为 initializeOrder()
的方法,带有 if-else 语句,我认为它是策略模式的一个很好的候选者,可以用来替换 if-else 语句。
但事实证明,如果我制定不同的策略,他们将需要不同的论点。
interaface OrderInitializeStrategy {
Order initialize(String orderValue, User user);
}
class InitializeOrderBasedOnProvidedValue implements OrderInitializeStrategy {
public Order initialize(String orderValue, User user) {
// user argument will never be used here, all I need is orderValue
}
}
class DefaultOrderInitializer implements OrderInitializeStrategy {
public Order initialize(String orderValue, User user) {
// need only user and probably there maybe more arguments, but orderValue will never be used
}
}
正如您可能会看到的那样,每个策略都有其自己的多余参数。在这种情况下如何实现策略模式有什么想法吗?或者也许这根本不适用,也许还有其他模式?
请注意,这只是一个示例,我只是提供 orderValue 和 user 参数作为示例。 在我的真实代码中可能会有更多参数,但要点是每个策略肯定会有不同的参数来初始化订单。
最佳答案
如果这只是为了避免 if 语句,那么策略模式在这里可能有点过分了。不过,为了便于讨论,这里有一个我认为可以达到您要求的建议。
您可以考虑将传递不同参数的工作转移到每个类的构造函数中。 OrderInitializerStrategy
的 2 个实现类不需要具有相同签名(相同参数)的构造函数。因此,您可以仅向每个构造函数传递该策略所需的内容。然后,initialize
方法可以不接受任何参数。
interface OrderInitializeStrategy {
Order initialize();
}
class InitializeOrderBasedOnProvidedValue implements OrderInitializeStrategy {
private final String orderValue;
public InitializeOrderBasedOnProvidedValue(String orderValue) {
this.orderValue = orderValue;
}
@Override
public Order initialize() {
// user argument will never be used here, all I need is orderValue
}
}
class DefaultOrderInitializer implements OrderInitializeStrategy {
private final User user;
public DefaultOrderInitializer(User user) {
this.user = user;
}
@Override
public Order initialize() {
// need only user and probably there maybe more arguments, but orderValue will never be used
}
}
关于java策略不同的论点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862633/