2013-02-15 4 views
6

나는 소유하지 않은 클래스의 구현을 숨기려고합니다. 나는 이것을 확장하고 클래스를 확장하고 내 인터페이스를 구현하려고한다. 다음은 필요한 클래스의 인스턴스가 생성되는 방법입니다.Java OO : 이것도 가능합니까?

QueueInfo info = admin.getQueue(queueName); 

QueueInfo는 내가 소유하지 않은 클래스입니다. 이 객체의 인스턴스를 가져 오려면 admin 객체를 사용해야합니다. IQueueInfo라는 인터페이스를 통해이 구현을 숨기고 싶습니다. IQueueInfo는 단지 QueueInfo에서 소비자가 필요로하는 것에 대한 액세스를 제공합니다. 따라서이 QueueInfo를 얻으려면 EMSQueueInfo라는 자체 객체를 통해 작업하고 싶습니다. 이건 내 소비자가 인터페이스 IQueueInfo 불구하고 작업 할 수 있습니다

public class EMSQueueInfo extends QueueInfo implements IQueueInfo { 
    //... 
} 

그것은 기본 EMSQueueInfo이 QueueInfo이 모든 것을에 액세스 할 수 있습니다 : 여기가이 설정을 구상하는 방법. 내 문제는 QueueInfo의 "라이브"인스턴스를 얻는 것입니다. QueueInfo의 일반 인스턴스를 얻으려면, 난 그냥 말할 수 :이 관리자 오브젝트가 작성되지 않았습니다 같이

QueueInfo info = new QueueInfo(queueName); 

이 인스턴스는 "라이브"아니다. 그래서, 이렇게 :

public class EMSQueueInfo extends QueueInfo implements IQueueInfo { 

    public EMSQueueInfo(String queueName){ 
     super(queueName); 
    } 

} 

내게 "라이브"개체를 제공하지 않습니다. 내가 할 수 있기를 원하는 것은 다음과 같습니다.

public class EMSQueueInfo extends QueueInfo implements IQueueInfo { 

    public EMSQueueInfo(String queueName, Admin admin){ 
     super = admin.getQueue(queueName); 
    } 

} 

하지만 불가능합니다.

나는 개인 varialbe를 통해 모든 메소드에 대한 액세스 권한을 얻기는 내 EMSQueueInfo 클래스에서 확장 제거하고 단지 자신을 위로 객체를 포장되어보고 있어요 유일한 해결책 :

public class EMSQueueInfo extends QueueInfo implements IQueueInfo { 

    private QueueInfo _queueInfo 

    public EMSQueueInfo(String queueName, Admin admin){ 
     _queueInfo = admin.getQueue(queueName); 
    } 

    public int getMessagesOnQueue() { 
     return _queueInfo.getMessagesOnQueue(); 
    } 

} 

해당 솔루션이 작동하지 않습니다 ,하지만 나는 그것을 싫어한다. 누구든지 더 좋은 방법을 생각할 수 있습니까? 나는 OO를 망치고 그것을 오용하려는 것일까 요? 소비자가 IQueueInfo로 작업 할 수 있기를 원하기 때문에 IQueueInfo를 사용하여 QueueInfo의 JMS 구현이나 QueueInfo의 MSMQ 구현에 액세스 할 수 있습니다. 어떤 도움이 굉장 할 것입니다!

+0

숨기려고하는 클래스를 확장하는 데주의해야합니다. 나는 구성에 문제가 보이지 않는다. –

+0

Google factory 메쏘드 – Bohemian

+0

당신은 'Adapter' 패턴을 묘사했습니다 : 당신은 무언가를 감싸서 그것의 특정 부분에만 접근을 허용합니다. 따라서 ** queueInfo를 숨기고 싶습니다. 그렇지 않으면 사람들이 원하는 필드뿐만 아니라 모든 필드에 액세스 할 수 있습니다. –

답변

5

당신이 제안한 것은 완벽하게 합리적인 것 같습니다. 어댑터 패턴 (감사합니다 Martinsos)입니다.

어쨌든 클래스 내의 Admin 개체를 숨길 수 있다면 더 좋을 것입니다. 예 :

public class EMSQueueInfo implements QueueInfoProvider { 

    private static Admin admin = new Admin(); 
    private QueueInfo queueInfo 

    public EMSQueueInfo(String queueName){ 
     queueInfo = admin.getQueue(queueName); 
    } 

    public int getMessagesOnQueue() { 
     return queueInfo.getMessagesOnQueue(); 
    } 

} 

인터페이스에 더 많은 "Java"이름을 지정하려고했습니다. I 접미사는 매우. NET입니다. 원래 클래스를 확장 할 필요가 없습니다.

그것은 당신이 가지고 구현하는 고통스러운 느낄 수는에 힘들게 당신의 QueueInfoProvider단지 흥미로운 방법 QueueInfo에서 복사,하지만 고통은 결국 가치가있을 것입니다.

이 접근법은 직접 제어 할 수없는 API에서 애플리케이션을 분리합니다. 그런 의미에서 이것은 Facade pattern과 유사합니다.

+1

죄송합니다. .NET에서 왔습니다. 다시 말하지만 전체 수업을 마무리하고 싶지는 않습니다. 위의 방법은 내가 피하는 것입니다. getMessagesOnQueue는 이미 QueueInfo의 일부입니다. –

+0

괜찮습니다. 이 디자인을 사용하면 래핑 할 메서드를 선택할 수 있습니다. 그것이 단지 하나라면, 괜찮습니다. –

+0

나는 당신이 옳다고 생각한다. 나는 클래스를 확장 할 때 모든 것을 다시 작성해야하는 느낌이 조금 들었습니다. 올바른 방법으로 느꼈습니다. –

6

당신이 싫어한다고 말하는 솔루션이 좋은 해결책이라고 생각합니다. OO를 망치거나 오용하지 않습니다.

잘하고있는 패턴은 Adapter pattern (Object Adapter pattern)입니다. 클래스에서 필요하지 않은 것은 QueueInfo를 확장하는 것입니다.

+0

답변도 정확합니다. Duncan을 당신보다 더 많이 받아 들인 이유는 그가 훌륭한 코드 예제를 제공했기 때문입니다. 귀하의 의견을 주셔서 감사합니다! –