定义
定义一个操作中算法的框架,而降一些步骤延迟到子类执行,使得子类可以在不改变算法框架的基础上就可以重定义算法的某些步骤
本质
固定算法框架
登场角色
-
AbstractClass(抽象类)
定义算法的框架,还可以定义算法中通用部分的实现。
-
ConcreteClass(具体类)
算法的具体实现类,用来实现算法框架中的某些步骤,即抽象方法,完成整个功能。
示例代码
/**
* 算法框架抽象类
*/
public abstract class AbstractDisplay {
abstract void open();
abstract void print();
abstract void close();
public final void display(){
open();
for(int i=0;i<5;i++){
print();
}
close();
}
}
/**
* 算法实现1
*/
public class CharDisplay extends AbstractDisplay {
private char aChar;
CharDisplay(char c){
this.aChar = c;
}
@Override
void open() {
System.out.print("<<");
}
@Override
void print() {
System.out.print(aChar);
}
@Override
void close() {
System.out.println(">>");
}
}
/**
* 算法实现方式2
*/
public class StringDisplay extends AbstractDisplay{
private String message;
private int width;
StringDisplay(String message){
this.message = message;
this.width = message.length();
}
@Override
void open() {
pringLine();
}
@Override
void print() {
System.out.println("|" + message + "|");
}
@Override
void close() {
pringLine();
}
private void pringLine(){
System.out.print("+");
for(int i=0;i<width;i++){
System.out.print("-");
}
System.out.println("+");
}
}
public class RunTemplate {
public static void main(String[] args){
AbstractDisplay charDisplay = new CharDisplay('a');
AbstractDisplay stringDiaplay = new StringDisplay("message");
System.out.println("这是第一种算法实现的输入内容:");
charDisplay.display();
System.out.println("这是第二种算法实现的输入内容:");
stringDiaplay.display();
}
}
运行结果
这是第一种算法实现的输入内容:
<<aaaaa>>
这是第二种算法实现的输入内容:
+-------+
|message|
|message|
|message|
|message|
|message|
+-------+
功能
模板方法的功能在于固定算法框架,而让具体的算法实现可以根据需要自己扩展,而又不偏离整体框架。即满足了子类的扩展,由固定了算法的步骤。模板方法的实现方式主要使用继承的方式。
优点
- 优点是实现了代码的复用,即算法框架抽象类中不仅可以封装算法框架,还可以封装公共代码。
缺点
- 缺点是算法框架不容易升级,因为实现方式多为继承的方式,如果修改了算法框架,所有涉及到的子类算法实现可能都需要进行相应的变化。所以在使用模板方法模式时,应尽量确保不会变化的部分,才会封装到算法框架抽象类中。