java策略不同的论点

标签 java strategy-pattern

学习策略模式我想知道这是否适用于我的代码的一部分。

假设有一个名为 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

    }
}

正如您可能会看到的那样,每个策略都有其自己的多余参数。在这种情况下如何实现策略模式有什么想法吗?或者也许这根本不适用,也许还有其他模式?

请注意,这只是一个示例,我只是提供 orderValueuser 参数作为示例。 在我的真实代码中可能会有更多参数,但要点是每个策略肯定会有不同的参数来初始化订单。

最佳答案

如果这只是为了避免 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/

相关文章:

c# - 在 C# 中,策略模式和委托(delegate)有什么区别?

java - Apache POI 在电子表格中仅记录 1 行

java - 文本中存在 ' 和/时的 Xpath 语法

c++ - 为什么我不能执行动态转换? C 中的策略模式

java - 复合策略模式 - java - 这段代码有多糟糕?

c++ - 理解策略模式

design-patterns - 谁应该实例化和分配运行时策略实现?

java - 通过接口(interface)将数据从类传递到 Activity 并修改 UI

java - 我如何升级此正则表达式不捕获 "1hey"或 "123_456_bye"或 "1123_hey"

java - 在 Java 中如何将变量从一个类传递到另一个类?