Java OO:这甚至可能吗?

Tyl*_*ght 6 java oop

我试图隐藏一个我不拥有的类的实现.我想要这样做我扩展课程并实现我自己的界面.以下是如何创建我需要的类的实例:

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实现.任何帮助都会很棒!

Mar*_*sos 6

我相信你说你讨厌的解决方案是一个很好的解决方案.它不会破坏OO或滥用它.

你正在做的是众所周知的模式称为适配器模式(对象适配器模式).只有你的类中不需要的东西是扩展QueueInfo.


Dun*_*nes 5

你所建议的似乎是完全合理的 - 它被称为适配器模式(感谢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模式类似.