2011-10-21 105 views
6

我有一個真正awfull類與兩個方法來啓動或停止某些服務時,該服務可用。類似下面的(他們是不是如果,別人的,只是如果):設計模式,以避免多個ifs

void startServices() { 
if (service1 == true) { 
    start1(); 
} 
if (service2 == true) { 
    start2(); 
} if (serviceN == true) { 
    startN(); 
} 
} 


void stopServices() { 
if (service1 == true) { 
    stop1(); 
} 
if (service2 == true) { 
    stop2(); 
} 
if (serviceN == true) { 
    stopN(); 
} 

} 

你建議我任何設計模式,使其更漂亮?

謝謝!

+0

我不會回答這個問題,因爲現有的答案很好,但我只想指出'if true'在任何if()中都有些多餘。 –

回答

4

取決於;我的第一反應是將服務存儲在散列或數組中。每項服務實現一個啓動和停止方法的接口。啓動或停止服務只需要一個服務密鑰或索引。

它仍然有點脆弱,但也許不知道更多我不知道如何「域化」ut,因此它看起來更像你正在做的事情。

4

您可以使用策略模式。

這個想法是,你應該知道當你實例化你的類時你要使用什麼策略(或者你可以動態地改變它)。因此,您可以在實例化時傳遞該策略(並可以稍後替換它)。

public interface IStartupStrategy 
{ 
    void Start(); 
} 

public interface IStopStrategy 
{ 
    void Stop(); 
} 

public class MyClass 
{ 
    private readonly IEnumerable<IStartupStrategy> startupStrategies; 
    private readonly IEnumerable<IStopStrategy> stopStrategies; 

    public MyClass(IEnumerable<IStartupStrategy> startup, IEnumerable<IStopStrategy> stop) 
    { 
     this.startupStrategies = startup; 
     this.stopStrategies = stop; 
    } 

    public void Start() 
    { 
     foreach(var strategy in this.startupStrategies) 
     { 
      strategy.Start(); 
     } 
    } 

    public void Stop() 
    { 
     foreach(var strategy in this.stopStrategies) 
     { 
      strategy.Stop(); 
     } 
    } 
} 
+0

這給我的印象是,戰略模式是盲目應用於這個問題。我不認爲這個命名太有意義,有多種啓動策略?每個服務一個? – Guven

+1

確實。我試圖清楚地表達這種模式,但是在這樣做的過程中,我將「應該」作爲「IService」分成多個啓動和停止策略。理想情況下,您可以使用「IService」接口來啓動和停止方法。然後,該服務可以決定是否要實施啓動或停止。這些服務將根據可用的服務進行傳遞,並且調用類將決定何時啓動或停止這些服務。這仍然是戰略模式,但戰略將有不止一種方法。 –

+0

我只是重新閱讀我在之前的評論中寫的內容。如果戰略模式本質上是通過一些調用類不提供的算法來執行,那麼整體控制的反轉可能會被認爲是一種策略模式?只是一個想法。 –

2

使用對象,那就是你有,你可以通過與繼承的方法停止關閉這些重複的服務列表()。

public interface Service { 
    void start(); 
    void stop(); 
} 

public class TestService implements Service { 
    @Override 
    void start() { 
    } 

    @Override 
    void stop() { 
    } 
} 

每個服務也可以存儲它的狀態,以便只在它們打開時關閉它們。

0

開關語句不太令人困惑。如果與枚舉代碼一起使用變得非常可讀。