2011-10-21 2 views
6

서비스를 사용할 수있을 때 일부 서비스를 시작하거나 중지하는 두 가지 방법으로 정말 awfull 클래스가 있습니다. 다음과 같은 뭔가 (그렇지 않은 경우-를 elses, 단지 경우입니다) :여러 개의 if를 피하기위한 디자인 패턴

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

기존 답변이 좋기 때문에 답변을하지 않겠지 만,'== true'는 모든 if()에서 다소 중복됨을 지적하고자합니다. –

답변

4

의존; 내 첫 번째 반응은 해시 또는 배열에 서비스를 저장하는 것입니다. 각 서비스는 시작 및 중지 메소드를 사용하여 인터페이스를 구현합니다. 서비스 시작 또는 중지에는 서비스 키 또는 색인 만 필요합니다.

아직 조금 부스러기는하지만, 더 많은 것을 알지 못해서 나는 "도메인 화"하는 방법을 잘 모르기 때문에 당신이하는 일과 더 비슷하게 보입니다.

4

전략 패턴을 사용할 수 있습니다.

아이디어는 클래스를 인스턴스화 할 때 사용할 전략 (또는 동적 latrr을 변경할 수 있음)을 알아야한다는 것입니다. 따라서 인스턴스화시 해당 전략을 전달할 수 있습니다 (나중에 선택적으로 대체 할 수도 있음).

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

개체를 사용합니다. 여기에는 상속 된 메서드 stop()을 사용하여 반복하여 처리 할 수있는 서비스 목록이 있습니다.

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

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

    @Override 
    void stop() { 
    } 
} 

각 서비스는 상태가 저장되어있는 경우에만 끄도록 설정할 수도 있습니다.

0

스위치 설명이 혼동되지 않습니다. enum과 함께 사용하면 코드가 매우 읽기 쉽습니다.