我试图隐藏一个我不拥有的类的实现.我想要这样做我扩展课程并实现我自己的界面.以下是如何创建我需要的类的实例:
QueueInfo info = admin.getQueue(queueName);
Run Code Online (Sandbox Code Playgroud)
QueueInfo是我不拥有的类.要获取此对象的实例,我必须使用管理对象来获取它.我想通过一个名为IQueueInfo的接口来隐藏这个实现.IQueueInfo将只提供对QueueInfo消费者需求的访问.因此,为了获得这个QueueInfo,我想通过我自己的对象EMSQueueInfo来工作.以下是我设想的设置方法:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
//...
}
Run Code Online (Sandbox Code Playgroud)
这允许我的消费者通过接口IQueueInfo工作,它允许底层EMSQueueInfo访问QueueInfo拥有的所有内容.我的问题在于获得QueueInfo的"实时"实例.要获得QueueInfo的常规实例,我可以说:
QueueInfo info = new QueueInfo(queueName);
Run Code Online (Sandbox Code Playgroud)
此实例不是"实时",因为它不是由管理对象创建的.所以,这样做:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
public EMSQueueInfo(String queueName){
super(queueName);
}
}
Run Code Online (Sandbox Code Playgroud)
不会给我一个"活"的对象.我希望能做的是这样的事情:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
public EMSQueueInfo(String queueName, Admin admin){
super = admin.getQueue(queueName);
}
}
Run Code Online (Sandbox Code Playgroud)
但这是不可能的.
我看到的唯一解决方案是从我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
该解决方案确实有效,但我有点讨厌它.谁能想到更好的方法?我只想破坏OO并滥用它吗?同样,我只是在做所有这些,因为我希望消费者能够使用IQueueInfo,将来,IQueueInfo可用于访问QueueInfo的JMS实现或QueueInfo的MSMQ实现.任何帮助都会很棒!
你所建议的似乎是完全合理的 - 它被称为适配器模式(感谢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();
}
}
Run Code Online (Sandbox Code Playgroud)
我试图给你的界面一个更"Java"的名字.该I后缀是非常.NET.应该没有必要扩展原始类.
实施起来会感到痛苦,因为你必须费力地只将有趣的方法复制QueueInfo到你的手中 QueueInfoProvider,但最终的痛苦将是值得的.
这种方法将您的应用程序与您无法直接控制的API分离.从这个意义上讲,它与Facade模式类似.