Don*_*dle 2 java oop abstract-class design-patterns
我有一个业务案例,其中需要依次发生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
}
}
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()并希望顺序始终正确?
您需要模板方法pattern。在类中创建一个doTransfer
方法(final
),以FileTransfer
定义需要调用的方法的顺序。还使用download
和upload
方法,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
方法,而不能覆盖任何其他方法。