0

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

3 回答 3

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;
}
于 2012-01-06T10:41:23.790 回答
1

要以 Dependency Inversion 方式执行此操作,您可以执行以下操作之一:

  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. 为列表添加变异器(设置器):

    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 实现的依赖。

于 2012-01-06T10:54:27.147 回答
0

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

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

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

于 2012-01-06T10:45:19.403 回答