Template Method模式
Template Method模式
在父类中定义处理流程的框架,在子类中实现具体处理。也就是父类中包含许多抽象方法和处理流程,这些抽象方法需要子类去实现,只要子类实现不同的处理,父类被调用的程序行为也会不同,但是处理流程都会按照父类所定义的那样执行。
示例程序
1、AbstractDisplay类
这里定义了三个抽象方法和一个模板方法display,抽象类的具体实现交个子类,模板方法就是调用抽象方法,并且固定了执行流程。并且,display模板方法使用了final修饰符,为了不让子类重写该方法。
package com.design.pattern3;
public abstract class AbstractDisplay {
//抽象类
public abstract void open();
public abstract void print();
public abstract void close();
//模板方法,固定了抽象方法的调用流程
public final void display(){
open();
for (int i = 0;i < 5 ;i++){
print();
}
close();
}
}
2、CharDisplay类(子类)
package com.design.pattern3;
public class CharDisplay extends AbstractDisplay{
private char ch;
public CharDisplay(char ch) {
this.ch = ch;
}
@Override
public void open() {
System.out.println("打开");
}
@Override
public void print() {
System.out.println(ch);
}
@Override
public void close() {
System.out.println("关闭");
}
}
3、StringDisplay类(子类)
package com.design.pattern3;
public class StringDisplay extends AbstractDisplay {
private String string;
public StringDisplay(String string) {
this.string = string;
}
@Override
public void open() {
System.out.println("打开");
}
@Override
public void print() {
System.out.println(string);
}
@Override
public void close() {
System.out.println("关闭");
}
}
4、 Main类
package com.design.pattern3;
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new CharDisplay('H');
AbstractDisplay d2 = new StringDisplay("hello world");
d1.display();
d2.display();
}
}
Templete Method模式需要两个元素:
1、AbstractClass(抽象类)
主要负责声明抽象方法,以及定义和实现模板方法。
2、ConcreteClass(具体类)
负责实现AbstractClass类中的抽象方法。
在AbstractClass类中,display方法使用了final修饰符,作用是为了不让子类重写该方法。还有一个问题,抽象类和接口很相似,接口同样可以定义抽象方法,为什么这里不用接口?答案是Templete Method模式中,抽象类(父类)必须定义和实现模板方法,也就是必须实现处理流程的框架,接口中无法实现。
使逻辑处理通用化
使用模板方法可以使逻辑处理通用化,就是在父类中编写算法,不需要在每个子类中再编写算法。
例如:如果没有使用模板方法,使用复制粘贴功能编写了多个ConcreteClass类,有ConcreteClass1、ConcreteClass2、ConcreteClass3等很多相似的类,在后期如果发现ConcreteClass1中有bug,那么就必须把所有ConcreteClass1相似的类都检查和修改一遍才行。如果使用Templete Method模式进行编程,当在模板方法中发现bug时,只需要修改模板方法即可。