java - 在抽象类中执行方法执行顺序

标签 java oop design-patterns abstract-class

我有一个业务案例,其中需要按顺序发生 3 件事:

  1. 下载()
  2. 进程()
  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),它定义了需要调用的方法的顺序。使 downloadupload 方法也成为 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/

相关文章:

java - 获取所有 Antlr 解析错误作为字符串列表

delphi - 接口(interface)和属性可见性

c++ - "Context Pattern"的这个实现看起来没问题吗?

javascript命名空间定义自引用

Java:跨多个服务器同步线程

java - 检查 java swing GUI 中的一系列点击

oop - 面向对象编程与函数式编程兼容吗?

php - 如何设置和使用 protected 静态属性?

cocoa - 如果所有方法都是可选的,那么协议(protocol)的目的是什么?

java - ThrowableInformation getThrowableStrRep() 的作用是什么?