模板方法模式
- 定义
模板方法模式(Template Method),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[DP]
- 优缺点
优点:
- 代码复用
- 子类的返回值决定父类的行为
缺点:
- 特点
- 父类将子类中重复的代码抽到一个公用方法当中
- 可以由子类的返回值来决定这个公用方法怎么执行(钩子函数)
- 结构
AbstractClass:拥有模板方法的父类
ConcreteClass:使用模板方法的子类
- 代码
例子:两个学生考试,试卷题目一样,答案不一样,打印出来
父类
/**
* @ Author :fonxi
* @ Date :2019/5/22 16:00
* @ Description:模板方法类
*/
public abstract class AbstractClass {
abstract String primitiveOperation1();
abstract String primitiveOperation2();
public void templateMethod(){
System.out.print("设计模式有多少种:");
System.out.println(primitiveOperation1());
System.out.print("抽象类中不能有非抽象方法:");
System.out.println(primitiveOperation2());
}
}
使用模板方法的子类
/**
* @ Author :fonxi
* @ Date :2019/5/22 16:02
* @ Description:实现类
*/
public class ConcreteClass1 extends AbstractClass{
@Override
String primitiveOperation1() {
return "23";
}
@Override
String primitiveOperation2() {
return "错";
}
}
/**
* @ Author :fonxi
* @ Date :2019/5/22 16:10
* @ Description:实现类
*/
public class ConcreteClass2 extends AbstractClass {
@Override
String primitiveOperation1() {
return "25";
}
@Override
String primitiveOperation2() {
return "对";
}
}
/**
* @ Author :fonxi
* @ Date :2019/5/22 16:01
* @ Description:客户端调用类
*/
public class TestController {
public void print(){
AbstractClass abstractClass;
abstractClass = new ConcreteClass1();
System.out.println("学生一的试卷:");
abstractClass.templateMethod();
System.out.println("---------------------------------------------------------------------------");
abstractClass = new ConcreteClass2();
System.out.println("学生二的试卷");
abstractClass.templateMethod();
}
}
输出:
学生一的试卷:
设计模式有多少种:23
抽象类中不能有非抽象方法:错
---------------------------------------------------------------------------
学生二的试卷
设计模式有多少种:25
抽象类中不能有非抽象方法:对
- 总结
把的重复的代码抽取到模板方法当中,起到复用的效果,模板方法模式算是最常用到的设计模式之一了,。