我有一个业务案例,其中需要按顺序发生 3 件事:
- 下载()
- 进程()
- 上传()
现在,抽象类 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
}
}
但有一个问题 -- 永远 永远 是可以让 MusicFileTransfer 在下载之前调用 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
}
在 FileTransfer 中环绕这三个调用。 但是为了让子类 MusicFileTransfer 覆盖 process() ...它必须是公共(public)的或 protected (不是私有(private)的)。
我应该怎么做才能解决这个问题?有一个 public doTransfer() 和 一个 public process() 并确保永远不会调用 process() 吗?或者取消 doTransfer() 并希望顺序始终正确?
最佳答案
您需要 template method pattern .在 FileTransfer
类中创建一个 doTransfer
方法 (final
),它定义了需要调用的方法的顺序。使 download
和 upload
方法也成为 final
,这样它们就不会被覆盖。 process
方法是抽象
方法;将其设置为 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
}
那么子类只能实现process
方法,不能覆盖任何其他方法。
关于java - 在抽象类中执行方法执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26125721/