2012-04-26 8 views
4

인터뷰 질문을 통해 고객이 차량의 사양을 볼 수 있도록 키오스크에서 자동차/트럭/밴을 표시하는 시스템을 어떻게 디자인 할 것인지 질문했습니다. (경고 : 나는 최근에 많은 OO 프로그래밍을하지 않았기 때문에 나쁜 어휘가 뒤따를 수도있다.)인터뷰에서 차량 구성 키오스크를위한 객체 지향 디자인

나는 휠베이스, 드라이브 트레인, HP와 같은 매우 기본적인 특성을 가진 차량으로 시작했다고 말했다. 그 다음 나는 그것을 차, 트럭 또는 밴으로 분류 할 것인데, 트럭을위한 침대 길이 또는 자동차의 트렁크 용량과 같은 더 구체적인 측정을 할 수 있습니다.

그런 다음 그들은 옵션을 추가하는 방법을 물었습니다. 나는 옵션이 모든 차량에 존재할 수 있으므로 차량에 옵션 목록이있을 수 있다고 말했을 것입니다.

마침내 그들은 그들이 트럭과 밴에서만 이용할 수 있었던 옵션이 있었지만 차가 아니라면 나는 물었다. 그리고 나는 약간 난처하게 굴었다. 설명 된 레이아웃을 고려해 볼 때이 방법을 멋지게 만들 수있는 방법이 있습니까? 이 문제를 해결하기 위해 클래스 계층 구조를 설정하는 더 좋은 방법이 있습니까? 아니면 약간의 추가 로직을 추가하지 않고도 쉽게 해결할 수없는 복잡한 문제일까요?

답변

4

그 시나리오에 대한 몇 가지 옵션이 있습니다.

첫째, 쉬운 :

옵션 # 1 - 트럭 용 인터페이스/반스

만 트럭과 밴이 옵션을 구현하는 경우, 다음의 인터페이스라는 IVehicleOptions을 만들고 트럭과 밴을 구현해야 :

이 단점은 이제 트럭과 밴과 다르게 자동차를 취급해야한다는 것입니다.

옵션 # 2 - 널 디자인 패턴

그러나, 당신은 널 디자인 패턴를 사용할 수 있습니다.자동차가 null IVehicleOptions를 구현, 그냥 돌아 보게한다

public class Car : IVehicleOptions 
{ 
    public VehicleOptions { get { return null; } } 
} 

옵션 # 3 - 전략 패턴

차량과 같은 기본 클래스 만들기 :

public abstract class Vehicle 
{ 
    public Options Options { get; protected set; } 
} 

를 그리고 각각의 구체적인 클래스 세트를 가지고 그것 :

public class Car : Vehicle 
{ 
    public Car() 
    { 
    this.Options = NullOptions(); // This is the null design pattern used with this strategy pattern 
    } 
} 

public class Truck : Vehicle 
{ 
    public Truck 
    { 
    this.Options = SuperOptions(); 
    } 
} 

public class Van: Vehicle 
{ 
    public Van 
    { 
    this.Options = ElegantOptions(); 
    } 
} 

지금 l 차량은 동일한 방법으로 처리 될 수 있습니다 (차량과 동일).

2

1 * make Vehicle 추상이므로 Class Car extends Vehicle과 같이 확장해야합니다.

2 * 모든 추상 메서드는 모든 구체적인 자식에 의해 구현되어야하지만 모든 메서드는 추상화가 필요합니다. 따라서 부분 구현을 사용하십시오.

3 *

는 클래스 TruckVan하지만 Car에 대한 옵션을 필요로하는 경우에 그래서, Vehicle에 구현하는 방법을 만들 수 있습니다. 그것이 구현 되었기 때문에, 어떤 어린이 든 그것을 대체 할 수있는 선택권이 있습니다.

4 * 인터페이스를 사용할 수도 있습니다. TruckVanCar이 공유 할 필요가없는 인터페이스를 공유 할 수 있습니다. 당신을 위해 오랜만 이후로

, 당신은 검토해야 http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

0

밴과 트럭에는 자동차에없는 추가 기능이 있기 때문에 공통 인터페이스에서 해당 기능을 추가 할 수 없으므로 밴과 트럭이 다른 인터페이스를 구현하는 솔리드 원리 중 하나 인 인터페이스를 분리한다고 생각합니다. 기본 인터페이스. 의미 : -

Interface IVehicle{ 
void move(); 
} 
Interface IVehicleExtra extends IVehicle{ 
// Have methods for extra features for Van and Truck 
void limitSpeedEighty(); 
} 
class Car implements IVehicle{ 
void move(){ 
} 
} 
class Van implements IVehicleExtra{ 
void move(){ 
} 
void limitSpeedEighty(){ 
} 
} 
class Truck implements IVehicleExtra{ 
void move(){ 
} 
void limitSpeedEighty(){ 
} 
} 

나는 이해하고 발표하기를 희망한다.

관련 문제