我有一个界面来表示具有竞争实现的数据结构。我需要在类中使用它,同时将类与必须知道底层数据结构分离。在这个类中,我需要创建这个实现的几个实例。如何使用界面注入来做到这一点?
class Foo {
Map<String, IDataStructure> map = new HashMap<String, IDataStructure>();
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, new SomeDataStructure(value));
}
}
}
修改
我发现了一种使用接口注入的方法。创建工厂界面
class ADataStructureFactory implements DataStructureFactory {
IDataStructure create() {
return new SomeDataStructure();
}
}
并在构造函数
中注入它Foo(DataStuctureFactory factory)
更改添加方法
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, factory.create());
}
}
答案 0 :(得分:1)
这是你可以做的:
在IDataStructure中定义一个add方法:
public interface IDataStructure {
public void add(String value);
}
创建一个名为ListDataStructure的IDataStrucutre实现,如下所示:
public class ListDataStructure implements IDataStructure {
private List<String> dataStructure = new ArrayList<String>();
@Override
public void add(String value) {
dataStructure.add(value);
}
}
创建一个名为SetDataStructure
的IDataStructure实现public class SetDataStructure implements IDataStructure {
private Set<String> dataStructure = new HashSet<String>();
@Override
public void add(String value) {
dataStructure.add(value);
}
}
按如下方式修改您的Foo类:
class Foo {
private Map<String, IDataStructure> map;
public Foo(Map<String,IDataStructure> map) {
this.map = map;
}
public void addValue(String key, String value) {
if(map.containsKey(key)) {
map.get(key).add(value);
} else {
/*handle what happens when data structure does not exist. Maybe thow an exception
}
}
}
如何注入支持的数据结构的示例。请注意,您无法动态定义数据结构。您需要使用受支持的数据结构实现在Foo中预填充地图。
public class DataStructureExample {
public static void main(String []args) {
Map<String,IDataStructure> dataStrucures = new HashMap<String,IDataStructure>();
//injecting different data structures into Foo
dataStrucures.put("List", new ListDataStructure());
dataStrucures.put("Set", new SetDataStructure());
Foo foo = new Foo(dataStrucures);
//add some value to a list data structure
foo.addValue("List", "Value1");
//add some valu to a set data structure
foo.addValue("Set", "Value1");
}
}
答案 1 :(得分:0)
我发现了一种使用接口注入的方法。创建一个抽象工厂。
class ADataStructureFactory implements DataStructureFactory {
IDataStructure create() {
return new SomeDataStructure();
}
}
并在构造函数
中注入它Foo(DataStuctureFactory factory)
更改添加方法
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, factory.create());
}
}