Java 面向对象 : Is this even possible?

标签 java oop

我试图隐藏一个不属于我的类的实现。我想通过扩展类并实现自己的接口(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/

相关文章:

c# - 传递给构造函数的变量是否应该作为属性可用?

java - 使用另一个 java 文件中的文本设置 JTextField 的内容

c++ - 为什么我们需要定义类的静态变量,而不是类的其他成员?

java - 为有经验的 C++ 开发人员快速切换到 Java

java - 在 Java 中应该使用什么舍入方法来计算金钱?

java - 在spring xml中初始化实现相同接口(interface)的类的多个实例

java - 正确配置以模拟 Hibernate 的 sessionFactory.getCurrentSession()

java - Java中的每个方法都可以重写吗

java - Apache2 和 PHPJAVA 桥

java - 通过CUSTOM listview显示SQLite信息