在不改变已实现的接口

时间:2016-06-05 08:31:07

标签: java interface

我有一个界面定义了一些数据检索服务方法:

public interface DataReceiver {
    public Data getData();
}

然后我有一个实现此接口的类并通过连接加载数据。我使用构造函数注入提供此连接:

public class ConnectionDataReceiver implements DataReceiver {
    private Connection connection;

    public ConnectionDataReceiver(Connection connection) {
        this.connection = connection;
    }

    public Data getData() {
        return connection.query("blabla");
    }
}

这很好用。我可以使用构造函数实例化我的ConnectionDataReceiver对象,或者我可以添加工厂方法/类,通过提供选择连接设置的配置文件的选项来扩展可用性。然后我通过我的界面使用我的新类,所以我可以轻松地交换实现(比如从文件而不是连接加载数据)。

但是,如果我想在运行时更改连接,而不实例化新的ConnectionDataReceiver,该怎么办?我必须为我的课程添加getter和setter。但由于它们不属于我的公共服务定义,我不能将它们放在我的界面中。我可以在我的代码中使用实现对象来设置一个新的连接,但是为了改变连接对象,它只是挂在对原始对象的引用上感觉很尴尬:

ConnectionDataReceiver conDataRec = new ConnectionDataReceiver(myConnection);
DataReceiver dataRec = conDataRec;
// use dataRec

conDataRec.setConnection(myNewConnection);
// use dataRec again

在这个例子中,它是最简单的方法来实例化一个新的ConnectionDataReceiver并重新分配dataRec,但是如果我的对象的实例化真的很贵呢?如何在仍然能够使用旧的服务接口的同时为我的实现类提供额外的功能?或者,当接口没有定义该功能时,它通常不会在运行时更改数据吗?

2 个答案:

答案 0 :(得分:1)

您可以做的是在界面中添加以下两个简单方法:

public Object getProperty(String name);

super

现在借助这两种简单方法,您可以在实现类中配置任意数量的附加功能,而无需为com.ibm.msg.client.jms.JmsQueueConnectionFactory类型的新功能(实现类)添加新方法。

此模式用于以下界面:

setCharProperty

界面包含setDoublePropertysetFloatProperty,{{1}}等,因此当他们发布新实施时,他们不必修改界面。

答案 1 :(得分:1)

我的版本:

接口

public interface DataReceiver 
{
    public Data getData();
}

实施

public class ConnectionDataReceiver implements DataReceiver 
{
    private Connection connection;

    public ConnectionDataReceiver(Connection connection) 
    {
        this.connection = connection;
    }

    public Data getData() 
    {
        return connection.query("blabla");
    }
}

在业务层使用接口,这里方法setReceiver将在运行时分配新的接口实现。

public class SomeBusinessLogic
{
    private DataReceiver receiver;

    public SomeBusinessLogic(DataReceiver receiver) 
    {
        this.receiver = receiver;
    }

    public void setReceiver(DataReceiver receiver) 
    {
        this.receiver = receiver;
    }
}    

使用此方法,您可以在运行时

中更改DataReceiver的实现