gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:18:13 25 4
gpt4 key购买 nike

我有很多行包含通用代码,其中只有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com