Java OO:这甚至可能吗?

时间:2013-02-15 13:54:22

标签: java oop

我正在尝试隐藏我不拥有的类的实现。我想要这样做我扩展课程并实现我自己的界面。以下是如何创建我需要的类的实例:

QueueInfo info = admin.getQueue(queueName);

QueueInfo是我不拥有的类。要获取此对象的实例,我必须使用管理对象来获取它。我想通过一个名为IQueueInfo的接口来隐藏这个实现。 IQueueInfo将只提供对QueueInfo消费者需求的访问。因此,为了获得这个QueueInfo,我想通过我自己的对象EMSQueueInfo来工作。以下是我设想的设置方法:

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

这允许我的消费者通过接口IQueueInfo工作,它允许底层EMSQueueInfo访问QueueInfo拥有的所有内容。我的问题在于获得QueueInfo的“实时”实例。要获得QueueInfo的常规实例,我可以说:

QueueInfo info = new QueueInfo(queueName);

此实例不是“实时”,因为它不是由admin对象创建的。所以,这样做:

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);
    }

}

但这是不可能的。

我看到的唯一解决方案是从我的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实现。任何帮助都会很棒!

2 个答案:

答案 0 :(得分:6)

我相信你说你讨厌的解决方案是一个很好的解决方案。它不会破坏OO或滥用它。

您正在做的是众所周知的模式,称为Adapter patternObject Adapter pattern)。只有您班级中不需要的东西才是扩展QueueInfo。

答案 1 :(得分:5)

你所建议的似乎完全合理 - 它被称为适配器模式(感谢Martinsos )。

如果你能以某种方式隐藏你班级中的Admin对象会更好。 E.g。

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。应该没有必要扩展原始类。

实施起来会感到痛苦,因为你必须费力地将只有有趣的方法从QueueInfo复制到你的QueueInfoProvider,但最终的痛苦将是值得的。

此方法将您的应用程序与您无法直接控制的API分离。从这个意义上说,它类似于Facade pattern