背景
假说在某公司存在框架开发人员和应用开发两个团队,框架开发团队会提供通用的基础Lib库给应用开发人员使用。在具体使用流程中需要应用开发人员在App中告诉Lib库是否已经ready了,如果App ready了,Lib就会继续与App交互。
例如:
Step 1:Lib初始化
Step 2:App 执行ready工作,ready之后告诉Lib;
Step 3:如果Appready,Lib程序就继续与App交互
解决方案
- Step 1和Step 3是Lib中稳定不变的动作,不论哪个业务App使用都会调用到这两个步骤,所以Lib将这两个Step内部封装起来;
- Step 2需要根据不同的App返回不同,所以Step需要App实现;
- Step 3是依赖Step2的;
- Step 1、2、3是一个完整的流程,Lib可以考虑将其封装成一个方法,然后整体提供一个接口给App
Lib库开发人员开发Lib库
abstract class Library {
public void run() {
initLibrary(); // step1: Library初始化
if (appReady()) { // step2: APP是否ready了
output(); // step3: Library继续运行
}
}
private void initLibrary() {
System.out.println("Library init");
}
protected abstract boolean appReady();
private void output() {
System.out.println("Hello world!");
}
}
应用开发者使用Lib库
class Application extends Library {
protected boolean appReady() { // APP实现Lib的Step2
System.out.println("APP: yeah, I'm Ready!");
return true;
}
public void startWork() {
super.run();
}
}
测试程序
在这里插入代码片public class MyClass {
public static void main(String args[]) {
Application app = new Application();
app.startWork();// Application运行
}
}
小结
- 以上就是Template Method(模板方法);
- 好在哪里?(围绕https://blog.csdn.net/u014294166/article/details/52494277)
(1) 将"早绑定"改为了"晚绑定":“晚绑定”即Lib->App, Lib开发人员写的早,但是写的早的Lib去绑定写的晚的App(因为App需要实现Step2);
(2) 实现框架与应用程序之间的松耦合;
(3) 稳定的部分:定义一个操作中的算法骨架;
变化的部分:而这个骨架中的一些步骤延迟到子类中;
复用:Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。