6

我试图隐藏我不拥有的类的实现。我想通过扩展类并实现自己的接口来做到这一点。这是我需要的类的实例是如何创建的:

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

这个实例不是“活的”,因为它不是由管理对象创建的。所以,这样做:

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 实现。任何帮助都会很棒!

4

2 回答 2

6

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

您正在做的是众所周知的模式,称为适配器模式对象适配器模式)。您的课程中唯一不需要的就是扩展 QueueInfo。

于 2013-02-15T14:01:34.430 回答
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 。应该不需要扩展原始类。

实施起来会很痛苦,因为您必须费力地将有趣的方法从 .QueueInfoQueueInfoProvider

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

于 2013-02-15T14:00:38.650 回答