【问题标题】:Testing Open-Close principle in Java在 Java 中测试 Open-Close 原则
【发布时间】:2021-12-16 19:44:42
【问题描述】:

为了演示SOLID原理的Open/Closed原理,我实现了如下代码。

代码:

interface IFaculty{
    void admin();
}

class ITFac implements IFaculty{
    @Override
    public void admin() {
        System.out.println("IT Fac Admin");
    }
}

class MedFac implements IFaculty{
    @Override
    public void admin(){
        System.out.println("Med Fac Admin");
    }
}

class University{
    public void adminFaculty(IFaculty iFaculty){
        iFaculty.admin();
    }
}

为了测试上面的代码,我尝试在main类的main方法中调用adminFaculty()方法如下。

代码:

public class Main {
    public static void main(String[] args) {
        University u1 = new University();
        u1.adminFaculty();   // cannot call this method without passing parameters
    }
}

但是我不能在不传递相关参数的情况下调用该方法:IFaculty 的一个对象。但我不能这样做。有人知道如何从 main 方法调用 adminFaculty() 吗?或任何方式调用 adminFaculty() 并运行代码以提供相关输出。?

谢谢。

【问题讨论】:

  • “但我不能这样做。” 为什么不呢? u1.adminFaculty(new MedFac());
  • 是否可以传递 IFaculty 对象,而不是 MedFac 对象。可能是我问的是愚蠢的。不过谢谢你的回复。
  • 没有IFaculty 对象这样的东西。只是一个接口,不能实例化接口。
  • 我明白@RobbyCornelissen。感谢您的评论。

标签: java open-closed-principle


【解决方案1】:

根据您的问题,我假设您希望能够致电 adminFaculty() 并始终使用相同的教师。为此,不要将教员传递给该方法,而是在University 中保留参考。您还可以添加默认教师。

class University {
  private IFaculty faculty;

  //default configuration of the university: it has a medical faculty
  public University() {
    this(new MedFac());
  }

  //allows to create a university with another faculty type
  public University( IFaculty faculty) {
    this.faculty = faculty;
  }

  public void adminFaculty(){
    faculty.admin();
  }
}

现在你可以像这样使用它了:

University medicalUni = new University();
medicalUni.adminFaculty();

University anotherMedicalUni = new University(new MedFac());
anotherMedicalUni.adminFaculty();

University itUni = new University(new ITFac());
itUni.adminFaculty();

请注意,您总是需要IFaculty 的实现,例如MedFacITFac。当然,我现在可以添加新教师而无需更改 University

class TechFac implements IFaculty{
  @Override
  public void admin() {
    System.out.println("Tech Fac Admin");
  }
}

University techUni = new University(new TechFac());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多