java - 应该如何修改这个类才能遵循 DIP(依赖注入(inject)原则)?

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

如何修改此类以遵循 DIP(依赖倒置原则),以便删除构造函数中的两个 ArrayList 依赖项?接口(interface)应该如何?

令我困惑的一件事是新引用指向 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);
    }
    ...
}

最佳答案

要以依赖倒置方式执行此操作,您可以执行以下操作之一:

  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. 为列表添加修改器(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;
    }
    

顺便说一句,我将 ArrayList 更改为 List。无需引入对 List 实现的依赖。

关于java - 应该如何修改这个类才能遵循 DIP(依赖注入(inject)原则)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8755915/

相关文章:

javascript - 使用 forRoot 依赖于模块的 Angular 传递服务

c# - 配置服务时如何通过依赖注入(inject)在 Azure Function V3 中注入(inject)或使用 IConfiguration

java - 如何在 Spring Boot 中加载和遍历属性文件

javascript - 在网站 mvc 中接收 ajax 响应

c# - Windows 应用程序中 Model View Controller 的问题

java - 关于解决方案的问题

asp.net-mvc - ASP.NET MVC Controller 中的构造函数依赖注入(inject)

java - Apache Cxf对不同的包提供不同的服务

java - 在 Java 库中,lotus.domino.Session 类方法 createDateTime() 抛出 NullPointerException

java - 如何解决地址无效异常