当前位置: 首页 > 知识库问答 >
问题:

在Java中测试开闭原理

符懿轩
2023-03-14
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();
    }
}

代码

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

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

谢谢你。

共有1个答案

后焕
2023-03-14

从您的问题来看,我假设您希望能够调用adminafully(),并且始终使用相同的教程。为此,不要将教程传递给方法,而是在Univerisity中保留一个引用。您还可以添加默认的教员。

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();

请注意,您总是需要iaffault的实现,比如medfacitfac。当然,我现在可以添加一个新的教员,而不必更改大学:

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

University techUni = new University(new TechFac());
 类似资料:
  • 简介 Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification. 软件实体(类,模块,方法等等)应当对扩展开放,对修改关闭,即软件实体应当在不修改的前提下扩展。 问题由来:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码

  • 问题内容: 开闭原则指出:“软件实体(类,模块,功能等)应为扩展而开放,而为修改而封闭”。 但是,约书亚·布洛赫(Joshua Bloch)在其著名的著作《有效的Java》中给出了以下建议:“设计和文档化继承,否则禁止继承”,并鼓励程序员使用“最终”修饰符禁止子类化。 我认为这两个原则显然彼此矛盾(我错了吗?)。编写代码时遵循什么原则?为什么?您是否让类保持打开状态,禁止继承其中的某些类(哪些?)

  • 滴滴(测试开发) 面试官居然是本科学姐,能感觉的到她在使劲捞我这个菜🐔 做过的项目数据库表怎么设计的 都有什么字段 写Sql语句(查询) Linux常见指令 如果没有收到请假指令怎么排查 SpringBoot常见的注解 @SpringBootapplication @Service @RestController @ResponseBody @Repository Nginx的模式 两种工作模式

  • 问题内容: 我想为GUI编写测试用例。我想知道如何模拟JButton的单击,或者如何提取JTable的元素。 为此,我构建了一个简单的GUI,如果单击按钮并且JTextfield为空,则将计数增加1,但是如果提供了数字,则计数将被JTextfield中的整数代替。当然,我想使用Regex来确保输入到JTextfield中的文本实际上是整数,但是让我们假设用户不会四处乱逛并输入非整数。另外,当JTa

  • 我在我的UI自动化框架中使用QAF开源Java库,并希望在每个测试中打开和关闭浏览器。但是,不能用下面的代码完成,因此由testSuccessfulLogin()打开的浏览器保持打开状态,因此testFailedLogin()失败。

  • 问题内容: 一般来说,我对Tensorflow和ML还是比较陌生,因此我对一个(可能)琐碎的问题表示歉意。 我使用辍学技术来提高网络的学习速度,并且看起来工作得很好。然后,我想在一些数据上测试网络,看它是否像这样工作: 显然,由于辍学仍然存在,每次产生不同的结果。我能想到的一种解决方案是创建两个单独的模型- 一个用于训练,另一个用于实际以后使用网络,但是,这种解决方案对我来说似乎不切实际。 解决此