强制抽象类中的方法执行顺序

Don*_*dle 2 java oop abstract-class design-patterns

我有一个业务案例,其中需要依次发生3件事:

  1. 下载()
  2. 处理()
  3. upload()

现在,抽象类FileTransfer提供了1. downloadFiles()和3. upload()的实现,但不提供2. process()- 子类(例如MusicFileTransfer或VideoFileTransfer或PDFFileTransfer)将在2. process( )阶段。

因此,使抽象类看起来像这样很明显:

public abstract class FileTransfer {

public void download() {
    // implementation provided
}

public abstract void process(); // implementation not provided

public void upload() {
    // implementation provided
}

}
Run Code Online (Sandbox Code Playgroud)

但是有一个问题- 永远 不会有这样的时间,例如MusicFileTransfer在download()或任何其他顺序之前调用process()。该进程必须始终为1. download(),2。process(),然后为3. upload()。

所以我想像这样:

public void doTransfer() {
    // private methods since we want to enforce this order of execution
    download(); // implem provided
    process(); // abstract method
    upload(); // implem provided
}
Run Code Online (Sandbox Code Playgroud)

在FileTransfer中包装这三个调用。但是为了使子类MusicFileTransfer覆盖process()...,它必须是公共的或受保护的(非私有的)。

我应该怎么做才能解决这个泡菜?有一个公共的doTransfer()一个公共的process()并只是确保从未调用过process()?还是取消doTransfer()并希望顺序始终正确?

rge*_*man 5

您需要模板方法pattern。在类中创建一个doTransfer方法(final),以FileTransfer定义需要调用的方法的顺序。还使用downloadupload方法,final因此它们不能被覆盖。该process方法是abstract方法; 使其protected无法从其他类中调用。不能是public,否则其他类可能会无序调用它。

public final void doTransfer() {
    // protected methods since we want to enforce this order of execution
    download(); // implem provided
    process(); // abstract method
    upload(); // implem provided
}
protected final void download() {
    // implementation provided
}

protected abstract void process(); // implementation not provided

protected final void upload() {
    // implementation provided
}
Run Code Online (Sandbox Code Playgroud)

然后,子类只能实现该process方法,而不能覆盖任何其他方法。