如何使用DRY原理创建实现相同方法的两种类型的对象



我不太擅长CS域语言,所以我希望我能让自己被理解。

我正在寻找一种DRY方法来创建基于boolean标志的两种类型中的对象。这两种类型各有一个方法,名称不同,实现相同的逻辑。这个逻辑我只想实现一次(想想这里的抽象超类,但我认为它在这种情况下不起作用)。

示例

更具体地说,考虑一下这一点。有两个类(在我的例子中,一个继承自org.eclipse.core.runtime.jobs.Job,另一个继承org.eclipse.ui.progress.UIJob(它本身扩展了org.eclipse.core.runtime.jobs.Job)。

两者都在运行类型的方法中实现了特定的逻辑(相同!)。对于扩展Job的类,此方法称为run(IProgressMonitor m),对于扩展UIJob的类,该方法称为runInUIThread(IProgressMonitor m)

我想能够

  1. 只实现一次逻辑(DRY!),例如,让run()runInUIThread都简单地调用,类似super.run()。但是,因为在Java类中不能扩展多个类,所以我不能执行类似MyUIJob extends UIJob, MyAbstractJob的操作,其中MyAbstractJob实现abstractRun()MyUIJob#runInUIThread(){ super.abstractRun() }
  2. 从相同的方法(例如,在处理程序类中)启动任一作业(MyJobMyUIJob),这取决于例如标志boolean isUIJob

我简要介绍了"AbstractFactory"one_answers"Prototype"等设计模式,但这些模式似乎不适用于我的情况,因为它们都需要"双扩展继承"。(或者我错了?)

因此出现了一个问题:我如何在Java中实现上述功能?

关于第1点:您可以使用委托:而不是继承

public class MyJob extends Job {
  private JobLogic logic;
  public MyJob(JobLogic logic) {
    this.logic = logic;
  }
  IStatus run(IProgressMonitor monitor) {
    return logic.run(monitor);
  }
}
public class MyUIJob extends UIJob {
  private JobLogic logic;
  public MyUIJob(JobLogic logic) {
    this.logic = logic;
  }
  IStatus runInUIThread(IProgressMonitor monitor) {
    return logic.run(monitor);
  }
}
public class JobLogic {
  IStatus run(IProgressMonitor monitor) {
    // logic goes here ...
  }
}

顺便说一句,如果需要的话,可以使用依赖注入框架将Jobs绑定到不同的逻辑实例。

最新更新