如何修改此类以遵循DIP(依赖注入原则)?

时间:2012-01-06 09:42:02

标签: java model-view-controller dependency-injection refactoring dependency-inversion

如何修改此类以遵循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);
    }
    ...
}

3 个答案:

答案 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中执行此操作,您可以执行以下操作之一:

  1. 列表的依赖关系在构造函数中给出:

    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;
    }
    
  2. 为列表添加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;
    }
    
  3. 顺便说一句,我将ArrayLists更改为Lists。没有必要对List实现引入依赖。

答案 2 :(得分:0)

我不会将List注入到对象中,从而打破封装,只是为了通过模拟列表进行单元测试。 List不是外部依赖项。它是班级内部的一部分。

如果要对此类进行单元测试,请测试使用列表中存储的对象的方法是否确实实际使用了它们。您还应该测试在更改已添加到控制器的模型的属性时调用propertyChange方法。

或者您可以添加getView()getModels()方法(可能受到保护),以测试添加是否按预期工作。