模板模式,简单说,就是基类(一个抽象类)存在已实现和未实现的方法,已实现的方法是通用的,未实现的方法是根据环境不同而不同的。模板类比较容易理解,举个例子:我们都是码农,写一个java代码步骤是什么?
- 配置jdk
- 下载eclipse、myeclipse、netbeans几个或者一个编译器
- 打开编译器
- 编写代码
我们简单分析一下:
- 配置jdk是所有程序员都需要做的,这是通用的;
- 下载编译器是程序员根据喜好自选的,当然可以直接在文本里编写,这是个性化的;
- 打开编译器是共性的,无论是文本文件还是各种编译器,都需要打开;
- 编写代码是个性的,这个就不用说了。
所以这里面我们可以将这些操作封装成一个类:
public abstract class TemplateMode {
//定义写程序需要的步骤有哪些
void downloadJDK() {
System.out.println("JDK1.8 downloaded");
}
abstract void downloadCompiler();
void openCompiler() {
System.out.println("Compiler opened");
}
abstract void completeCode();
}
实际上,我们没有完成这个抽象类,因为在继承他的子类中,可以先调用openCompiler,再调用downloadJDK等。那不就完了!因为JDK是java基础,所以我们不希望程序员改变该类的调用顺序,所以:
public abstract class TemplateMode {
//定义写程序需要的步骤有哪些
void downloadJDK() {
System.out.println("JDK1.8 downloaded");
}
abstract void downloadCompiler();
void openCompiler() {
System.out.println("Compiler opened");
}
abstract void completeCode();
final void finishCompiling() {
this.downloadJDK();
this.downloadCompiler();
this.openCompiler();
this.completeCode();
}
}
定义了final,该方法将不会被改写。剩下的就是实现了。
public class FinishCompiling extends TemplateMode {
public FinishCompiling() {}
public static void main(String[] args) {
FinishCompiling finishCompiling = new FinishCompiling();
finishCompiling.finishCompiling();
}
@Override
void downloadCompiler() {
System.out.println("Eclipse downloaded");
}
@Override
void completeCode() {
System.out.println("Code Completed");
}
}
我们看到,其实模板模式很简单。现在总结一下优缺点:
- 优:
- 符合开闭原则,当我们想实现不同的类时,只需要实现不同的抽象方法。
- 被实现的方法不影响已实现的方法。
- 行为由父类控制,子类实现,比较安全。
- 缺:
- 不同的场景实现不同的类。当场景过多的时候,可能使系统过为庞大