2014-01-09 55 views
0

我有很多帶有公共代碼的行,其中只有一行在一些實現上有所不同。靜態策略或枚舉類似代碼中的小實現更改?

通常我會爲此選擇一種策略模式。但我想知道在這裏是否可以採用更好的方法。以下面的例子。假設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); 

是否有過其他的一種方法什麼好處?你會選擇哪種情況?

+1

我發現第一種方法有點乾淨。我也相信,如果你的界面總是隻有一個實現,那麼你應該重新考慮爲什麼你有這個界面。 – Moeri

+2

只是扔在那裏:與枚舉,你基本上可以做到兩個。您的策略枚舉可以有更新方法。那麼你不需要交換機,但同時客戶端必須通過一個現有的常量。 – Radiodef

回答

4

策略模式(如果Java已經有lambda表達式,則更爲簡潔)可以通過附加策略擴展,而枚舉方法則不適用。作爲設計決策,這基本上歸結爲expression problem

如果您有許多以不同方式對這些枚舉進行操作的方法,請選擇enum方法,如果您添加枚舉項並忘記更新其中一種方法,您可能會使用want a compiler warning。如果您希望定義更多操作,則可以選擇策略模式,可能在程序的其他模塊中。

如果您只有一種方法處理枚舉/策略,並且枚舉/策略集不太可能改變,那麼選擇哪個並不重要。我可能會在Java 7中使用枚舉,因爲它們更簡潔。

此外,請記住,枚舉可以有方法,所以枚舉項可以實現您的更新方法,就像策略一樣。是否喜歡這個轉換語句是一個品味問題。

2

我認爲使用enum會是一個更好的方法。

  • 它會迫使程序員只使用這些方法中的一種來進行數學運算。
  • 就個人而言,使用枚舉看起來比爲同一目的創建靜態類更清潔。
  • 如果需要添加或刪除某些數學運算,則更容易修改enum而不是使靜態嵌套類實現接口,然後再次實例化它。

再次,這是我個人的意見,並可以從其他

1

不同,這個問題可以開始整個辯論。即使第一種方法看起來更清潔,我也會採用第二種方法 - 我的意思是戰略模式。使用枚舉和開關使您的代碼緊密耦合 - 如果需要添加新的操作,那麼交換機需要更多的案例。另一方面,遵循OOAD和OOP最佳實踐DRY並使用SOLID(即Open/Closed Principle)即即使這段代碼片段看起來更復雜,我也會選擇Strategy模式。

希望這可以幫助你!