我有一个接口(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/