我想要隐藏一个我不拥有的类的实现细节。我计划通过扩展该类并实现自己的接口来实现此目的。下面是需要创建的类的示例:
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类中移除extends,并仅仅通过私有变量来包装对象,以获取对所有方法的访问:
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实现。任何帮助都将是惊人的!