java - 在类似代码中进行小的实现更改的静态策略或枚举?

标签 java design-patterns enums strategy-pattern

我有很多行包含通用代码,其中只有 1 行与某些实现不同。

通常我会为此选择一种策略模式。但我想知道枚举 switch() 是否是更好的方法。以下面的例子为例。假设对象可以是任何具有数学方法的对象,例如add()、multiply()、substract()等。

对于枚举,我会这样:

enum Strategy {
    ADD, SUB, MUL;  
}

class DigitUtil {
    public static void update(Object obj, int n, Strategy strat) {
        //some DB stuff

        switch(strat) {
            case ADD: obj.add(n);
                break;
            case SUB: obj.subtract(n);
                break;
            case MUL: obj.multiply(n);
                break;
        }

        //some other DB stuff
    }
}

用法:

DigitUtil.update(obj, 1, Strategy.ADD); //this adds 1 to the object
DigitUtil.update(obj, 10, Strategy.SUB); //this subtracts 10 from the object

或者您更愿意为这些类型的操作选择策略模式?

class DigitUtil {
    public static void update(Object obj, int number, Strategy strat) {
        //some DB stuff

        strat.update(obj, number);

        //some other DB stuff
    }

    interface Strategy {
        void update(Object object, int number);
    }

    static class Add implements Strategy {
        @Override
        public oid update(Object obj, int n) {
            obj.add(n);
        }
    }

    static class Subtract implements Strategy {
        @Override
        public oid update(Object obj, int n) {
            obj.subtract(n);
        }
    }

    static class Multiply implements Strategy {
        @Override
        public oid update(Object obj, int n) {
            obj.multiply(n);
        }
    }

    public static final Strategy ADD = new DigitUtil.Add();
    public static final Strategy SUB = new DigitUtil.Subtract();
    public static final Strategy MUL = new DigitUtil.Multiply();
}

用法:

DigitUtil.update(obj, 1, DigitUtil.ADD);
DigitUtil.update(obj, 10, DigitUtil.SUB);

一种方法相对于另一种方法有什么好处吗?在什么情况下你会选择哪一个?

最佳答案

策略模式(如果 Java 已经有了 lambda,策略模式会更加简洁)可以通过其他策略进行扩展,而枚举方法则不然。作为一个设计决策,这基本上可以归结为 expression problem .

如果您有许多方法以不同的方式对这些枚举进行操作,则选择枚举方法,并且您可能want a compiler warning如果您添加枚举条目并忘记更新其中一种方法。如果您希望定义更多操作(也许在程序的其他模块中),请首选策略模式。

如果您只有一种方法来处理枚举/策略,并且枚举/策略集不太可能更改,那么您选择哪个并不重要。我可能会选择 Java 7 中的枚举,因为它们更简洁。

此外,请记住枚举可以有方法,因此枚举条目可以像策略一样实现您的更新方法。是否更喜欢它而不是 switch 语句是一个品味问题。

关于java - 在类似代码中进行小的实现更改的静态策略或枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21016623/

相关文章:

java - 通过反射提取和设置枚举值

java - 如何使用 Spring Boot 将生成的 PDF 文件保存到 MySQL 数据库?

python - 对数据对象的依赖注入(inject)

java - 连接池

ruby-on-rails - SaaS 应用程序是如何组织的?

Flutter状态管理-使用的架构

c++ - 枚举成员与类名冲突

java - GWT警告: "Call to Enum method toString when enum obfuscation is enabled"

java - 无法子类化最终类 com.sun.jmx.mbeanserver.JmxMBeanServer

java - Spark Streaming 收到警告 "replicated to only 0 peer(s) instead of 1 peers"