如何修改此类以遵循DIP(依赖性倒置原则)以删除构造函数中的两个ArrayList依赖项?界面应该如何?
令我困惑的一件事是新引用指向ArrayList<type>
而不仅仅是类的构造函数。我不知道如何处理这种情况......
package mvc.controllers;
import java.util.ArrayList;
import mvc.models.AbstractModel;
import mvc.views.AbstractViewPanel;
public abstract class AbstractController {
private ArrayList<AbstractViewPanel> registeredViews;
private ArrayList<AbstractModel> registeredModels;
public AbstractController() {
registeredViews = new ArrayList<AbstractViewPanel>();
registeredModels = new ArrayList<AbstractModel>();
}
public void addModel(AbstractModel model) {
registeredModels.add(model);
model.addPropertyChangeListener(this);
}
public void removeModel(AbstractModel model) {
registeredModels.remove(model);
model.removePropertyChangeListener(this);
}
public void addView(AbstractViewPanel view) {
registeredViews.add(view);
}
public void removeView(AbstractViewPanel view) {
registeredViews.remove(view);
}
...
}
答案 0 :(得分:1)
您要删除的依赖关系并不是很清楚,但是如果要删除显式的ArrayList实例,则可以使用构造函数注入:
private final List<AbstractViewPanel> registeredViews;
private final List<AbstractModel> registeredModels;
public AbstractController(final List<AbstractViewPanel> registeredViews,
final List<AbstractModel> registeredModels) {
this.registeredViews = registeredViews;
this.registeredModels= registeredModels;
}
答案 1 :(得分:1)
要在Dependency Inversion -way中执行此操作,您可以执行以下操作之一:
列表的依赖关系在构造函数中给出:
public abstract class AbstractController {
private List<AbstractViewPanel> registeredViews;
private List<AbstractModel> registeredModels;
public AbstractController(List<AbstractViewPanel> registeredViews, List<AbstractModel> registeredModels) {
this.registeredViews = registeredViews;
this.registeredModels = registeredModels;
}
为列表添加mutators(setter):
public abstract class AbstractController {
private List<AbstractViewPanel> registeredViews;
private List<AbstractModel> registeredModels;
public AbstractController() {
}
public void setRegisteredViews(List<AbstractViewPanel> views) {
this.registeredViews = views;
}
public void setRegisteredModels(List<AbstractModel> models) {
this.registeredModels = models;
}
顺便说一句,我将ArrayLists更改为Lists。没有必要对List实现引入依赖。
答案 2 :(得分:0)
我不会将List注入到对象中,从而打破封装,只是为了通过模拟列表进行单元测试。 List不是外部依赖项。它是班级内部的一部分。
如果要对此类进行单元测试,请测试使用列表中存储的对象的方法是否确实实际使用了它们。您还应该测试在更改已添加到控制器的模型的属性时调用propertyChange方法。
或者您可以添加getView()
和getModels()
方法(可能受到保护),以测试添加是否按预期工作。