我试图隐藏我不拥有的类的实现。我想通过扩展类并实现自己的接口来做到这一点。这是我需要的类的实例是如何创建的:
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 实现。任何帮助都会很棒!