2013-02-18 2 views
2

자바에서는 데코레이터 패턴을 사용하고 있습니다. 때로는 Object이 많은 클래스로 꾸며질 수 있으므로 많은 유형을 얻습니다. 어떻게하면 모든 다른 유형의 Object를 얻을 수 있습니까?Java에서 객체가 확장하는 모든 클래스를 나열하는 방법은 무엇입니까?

abstract class: plate 
concrete class: JapanesePlate, WesternPlate 

abstract plateDecorator extends plate 
concrete decorators: MeatPlateDecorator, TomatoPlateDecorator, 

때로는 JapanesePlateMeatPlateDecorator 또는 TomatoPlateDecorator 또는 두 가지 모두로 장식 할 수 있습니다.

나는 이것을 알 수있는 방법이 있는지 알고 싶습니다.

+1

* "많은 클래스로 장식 할 수 있으므로 많은 종류의 객체가 생성됩니다"라는 것이 정확히 무엇을 의미합니까? 예를 들면 도움이 될 것입니다. –

+0

나는 왜 그럴 필요가 있니? 기본 클래스가 해당 하위 클래스를 알기 위해 OO 철학에 반대입니다. – Rohit

+0

실제로, 일부 테스트 목적으로 만 사용하고 있습니다. – Noor

답변

0

getSuperClass을 사용하십시오. 필요한 경우, 당신은 또한 getInterfaces를 사용할 수 있습니다

Class objectClass = object.getClass(); 
    while (objectClass != null) { 
    Class parent = objectClass.getSuperClass(); 
    Class [] implementedInterfaces = objectClass.getInterfaces() 

    objectClass = parent; // continue upward in the hierarchy. 
    } 
+0

예제를 추가했습니다.이 plate.getClass(). getSuperclass()가 내 문제를 어느 정도 해결하지만 클래스 plate.PlateDecorator 만 반환하지만, 고기 데코레이터 또는 토마토 데코레이터 아니면 둘다 – Noor

2

데코레이터 가 장식 된 클래스의 예를-A를 가지고, 그리고 을 형성하지 않기 때문에 당신은 임의의 장식 계층 구조를 형성하는 모든 클래스를 찾을 수 없습니다를 is-a 관계입니다.

JDK의 구체적인 예는 다음과 같습니다. BufferedInputStream은 입력 스트림의 데코레이터입니다. FilterInputStreamInputStream을 포함하는 클래스 계층 구조의 일부이지만 클래스에 대해 알려주지 않으므로 으로 꾸미지 않습니다.

BufferedInputStream이 구현 된 방법을 알고있는 경우 리플렉션을 사용하여 꾸미고있는 스트림을 조사 할 수는 있지만 조사에 도움이되지 않는다면, 예를 들어 BufferedOutputStream입니다.

public interface Decorator<T> { 
    T getDecoratedObject(); 
} 

지금 당신의 장식 도보 특별 Decorator 인터페이스를 확인뿐만 아니라 랩 된 개체를 열 캐내다 수 있습니다 당신은 클래스 계층 구조를 제어 할 경우

0

는, 당신의 최선의 선택은 장식 인터페이스를 소개 아마.

클래스를 변경할 수없는 경우 리플렉션 해커 및 휴리스틱에 의존해야 할 것입니다.

관련 문제