我正在尝试隐藏我不拥有的类的实现。我想要这样做我扩展课程并实现我自己的界面。以下是如何创建我需要的类的实例:
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实现。任何帮助都会很棒!
答案 0 :(得分:6)
我相信你说你讨厌的解决方案是一个很好的解决方案。它不会破坏OO或滥用它。
您正在做的是众所周知的模式,称为Adapter pattern(Object 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。