gpt4 book ai didi

java - 向实现类添加功能而不更改实现的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 02:54:35 29 4
gpt4 key购买 nike

我有一个接口(interface),它定义了一些用于数据检索的服务方法:

public interface DataReceiver {
public Data getData();
}

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

public class ConnectionDataReceiver implements DataReceiver {
private Connection connection;

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

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

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

但是如果我想在运行时更改连接而不实例化新的 ConnectionDataReceiver 该怎么办?我必须为我的类(class)添加 getter 和 setter。但由于它们不是我的公共(public)服务定义的一部分,因此我无法将它们放入我的界面中。我可以在代码中使用实现对象来设置新连接,但是仅仅为了更改连接对象而保留对原始对象的引用感觉非常尴尬:

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

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

在此示例中,最简单的方法是实例化一个新的 ConnectionDataReceiver 并重新分配 dataRec,但是如果我的对象的实例化非常昂贵怎么办?如何为我的实现类提供附加功能,同时仍然能够使用我的旧服务接口(interface)?或者当接口(interface)没有定义该功能时,它通常不赞成在运行时更改数据?

最佳答案

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

public void setProperty(String name, Object value);

public Object getProperty(String name);

现在,借助这两个简单方法,您可以在实现类中配置任意数量的附加功能,而无需在 super 中为(实现类的)新功能添加新方法。类型。

该模式用于以下界面:

com.ibm.msg.client.jms.JmsQueueConnectionFactory

界面有setCharProperty , setDoubleProperty , setFloatProperty等等,这样当他们发布新的实现时,他们就不必修改接口(interface)。

关于java - 向实现类添加功能而不更改实现的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37639922/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com