我有很多帶有公共代碼的行,其中只有一行在一些實現上有所不同。靜態策略或枚舉類似代碼中的小實現更改?
通常我會爲此選擇一種策略模式。但我想知道在這裏是否可以採用更好的方法。以下面的例子。假設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);
是否有過其他的一種方法什麼好處?你會選擇哪種情況?
我發現第一種方法有點乾淨。我也相信,如果你的界面總是隻有一個實現,那麼你應該重新考慮爲什麼你有這個界面。 – Moeri
只是扔在那裏:與枚舉,你基本上可以做到兩個。您的策略枚舉可以有更新方法。那麼你不需要交換機,但同時客戶端必須通過一個現有的常量。 – Radiodef