类似代码中的小实现的静态策略或枚举更改?

问题描述 投票:2回答:4

我有许多使用公共代码的行,其中只有一行在某些实现中有所不同。

通常我会为此选择一种策略模式。但我想知道enum switch()是否可以成为更好的方法。以下面的例子为例。假设Object可以是任何具有数学方法的对象,如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 design-patterns enums strategy-pattern
4个回答
4
投票

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

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

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

另外,请记住枚举可以有方法,因此枚举条目可以像策略一样实现更新方法。是否喜欢这个而不是转换声明是一个品味问题。


2
投票

这个问题可以开始整个辩论。即使第一种方法看起来更清洁,我也会采用第二种方法 - 我的意思是策略模式。使用枚举和开关可以使代码紧密耦合 - 如果需要添加新操作,则交换机需要更多案例。另一方面,遵循OOAD和OOP最佳实践DRY并使用来自SOLID(即Open/Closed Principle)的O,即使此代码片段看起来更复杂,我也会选择策略模式。

希望这对你有所帮助!


2
投票

我认为使用enum将是一个更好的方法。

  • 它将迫使程序员仅使用其中一种方法进行数学运算。
  • 就个人而言,使用枚举看起来比为同一目的创建静态类更清晰。
  • 如果需要添加或删除一些数学运算,那么更容易修改enum而不是使静态嵌套类实现接口然后再次实例化它。

这是我个人的意见,它可能与其他人不同


0
投票

假设您创建了一个包含DigitUtil的SDK。现在,千位客户中的一个需要将此方法用于新的自定义策略(例如Division):

在枚举方法中,您必须升级SDK,但使用策略模式,您不需要进行任何更改。

© www.soinside.com 2019 - 2024. All rights reserved.