2013-05-13 7 views
0

나는 다음과 같은 문제를 해결하기 위해 깨끗한 패턴을 찾고 있어요에 대한 일반 GUI 만들기 . 각 유형의 차량에는 몇 가지 특정 특성이 있습니다.하위 클래스

나는 차량 목록을 가지고 있으며 사용자가 차량을 선택하고 속성을 편집 할 수있게 해주는 GUI를 만들어야합니다. 결과는 왼쪽에 차량 목록 (JList 사용)을 표시하고 오른쪽에 선택한 차량을 편집하는 데 필요한 필드가있는 패널을 표시하는 것입니다.

목록에 항목 유형이 하나만있는 경우 (왼쪽의 Jlist를 사용하고 오른쪽의 맞춤 JPanel을 사용하는 경우)하는 방법을 알고 있습니다. CarPanel, BikePanel ... 내 문제는 선택한 차량 유형과 해당 패널 사이의 연결입니다. 그것이 효과가 있지만, 나는 그런 것을 피하고 싶습니다 :

if (selectedVehicle instanceof Car) { 
    useThisPanel(new CarPanel((Car)selectedVehicle)); 
} ... 

그것은 나에게 매우 유지할 수없는 것 같아서.

나는 또한 어떤 차량 클래스가 내가 현재 MVC 패턴에 내 코드를 전환 일하고 있어요

를 표시하는 방식에 대해 아무것도 알고 있어야 할 이유가 없기 때문에 useThisPanel(selectedVehicle.getPanel()) 같은 것을 피하려고하지만 보인다

내게는 내 문제를 해결할만큼 충분하지 않다.

나는이 문제를 처음으로 다루는 사람이 아니라고 확신하지만 이런 종류의 상황을 관리하기위한 어떤 대답이나 조언도 찾을 수 없었다.

+0

리플렉션을 사용하여 필드 이름과 유형을 가져옵니다. –

답변

1

객체 지향 방법으로이 문제를 해결하는 일반적인 방법은 사용하는 것입니다 visitor pattern :

public interface VehicleVisitor<T> { 
    T visitCar(Car car); 
    T visitTruck(Truck truck); 
    T visitBike(Bike bike); 
} 

public abstract class Vehicle { 
    public abstract <T> T accept(VehicleVisitor<T> visitor); 
} 

public class Car extends Vehicle { 
    @Override 
    public <T> T accept(VehicleVisitor<T> visitor) { 
     return visitor.visitCar(this); 
    } 
} 

// same for Bike and Truck 

그리고 마지막으로

public class SomeClass { 
    private JPanel createPanelFor(Vehicle vehicle) { 
     return vehicle.accept(new VehicleVisitor<JPanel>() { 
      @Override 
      public JPanel visitCar(Car car) { 
       return new CarPanel(car); 
      } 
      // same for Truck and Bike 
     } 
    } 
} 

이 깨끗하고 모든이지만, 좀 더 어려운에의 간단한 인스턴스 기반 솔루션보다 이해하십시오. 그것은 장점이 있습니다 : 당신은 새로운 Vehicle 타입을 처리하는 것을 잊을 수 없습니다 : 이것은 당신이 추상 메소드 인 accept()을 구현하도록 강제 할 것이고, 이것은 당신이 Visitor 인터페이스에 또 다른 메소드를 추가하게 할 것입니다. 방문객.

+0

젠장, 내가 직접 찾아야 했어,이 패턴은 내 책에있다! 그것은 완벽하게 질문에 답합니다. 고맙습니다. – Zerdligham

+0

매우 멋진 강의 +1 – mKorbel

관련 문제