2014-11-25 2 views
0

하나 이상의 요구 사항이있을 때까지 클래스 메서드가 실행되지 않도록하는 디자인 패턴이 있습니까?하나 이상의 요구 사항이있을 때까지 클래스 메서드가 실행되지 않도록하는 디자인 패턴이 있습니까?

예를 들어 자동차 일 수도 있고 자동차를 시동하려면 가솔린, 점화 키가 필요하며 열쇠를 돌릴 수 있습니다.

의존성 요구 사항 (및 필요한 순서화) 문제를 해결하려면 어떻게해야하고 점화는 키가 없으면 시작되지 않으며 키가 삽입되지 않으면 키가 돌아 가지 않습니다.

는 여기에 내가 두 함정을 알고 두 가지 방법이 있습니다 : -

void startCar() 
    if checkPetrol() 
     if checkKeyIn() 
      if checkKeyTurn() 
       startEngine() 

도 가능하지만 그것뿐만 아니라 검사를 많이 필요로하는 스위치 문을 사용하여

.

어떻게 해결할 수 있습니까?

+4

당신은 [주 패턴] 보라 (http://en.wikipedia.org/ : 나는 적절한 예외 처리와 함께 (만 startCar()공공입니다) Facade design pattern와 결합 같은 것을 생각하고 wiki/State_pattern). –

+0

상태 패턴이 적합하지 않습니다. 열쇠를 돌릴 필요가 없습니다. 모든 조건이 충족되어야하므로 복합 술어가 더 나을 것입니다. – Basilevs

답변

0

다른 적합한 솔루션이 더 많을 수도 있지만 여기서는 Observer pattern을 사용할 수 있습니다. 사실 객체 간의 의존성을 정의 할 수 있으므로 한 객체가 상태를 변경하면 모든 종속 객체가 자동으로 통지되고 업데이트됩니다.

void startCar(){ 
    if (checkPetrol()){ 
     if (checkKeyIn()){ 
      if (checkKeyTurn()){ 
       startEngine() 
      }else{ 
      throw new CarCustomException("You need to turn the key in order to start."); 
      } 
     }else{ 
     throw new CarCustomException("Car can't start without a key."); 
     } 
    }else{ 
     throw new CarCustomException("Not enough fuel."); 
    } 
} 
+0

왜'if (! condition) throw new error;'? – Basilevs

+0

나는이 방법이 더 읽기 쉽다고 생각한다. 조건의 흐름은 이해하기 쉽고 유지하기 쉽다. – ekostadinov