我试图隐藏一个不属于我的类的实现。我想通过扩展类并实现自己的接口(interface)来做到这一点。以下是我需要的类的实例是如何创建的:
QueueInfo info = admin.getQueue(queueName);
QueueInfo 是我不拥有的类。要获取此对象的实例,我必须使用管理对象来获取它。我想通过一个名为 IQueueInfo 的接口(interface)隐藏此实现。 IQueueInfo 将只允许访问消费者从 QueueInfo 需要的内容。因此,要获得此 QueueInfo,我想通过我自己的名为 EMSQueueInfo 的对象进行工作。以下是我设想的设置方式:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
//...
}
这允许我的消费者通过接口(interface) 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 类中删除扩展并自己包装对象,通过私有(private)变量访问所有方法:
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 实现。任何帮助都会很棒!
最佳答案
我相信您所使用的您讨厌的解决方案是一个很好的解决方案。它不会破坏 OO 或滥用它。
您正在做的是名为 Adapter pattern 的众所周知的模式(Object Adapter pattern)。您的类中唯一不需要的是扩展 QueueInfo。
关于Java 面向对象 : Is this even possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14896267/