1、简介
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
简单点说就是说把一些公共的方法提取到抽象类中,并定义实现顺序,一些具体的细节则由子类实现。 使用场景 重要,复杂的方法,例如框架的骨架;有多个子类共有方法,且逻辑相同。
2、具体实现
abstract class WorkTemplate{
public final void first(){
System
.out
.println("起床");
}
public abstract void second();
public final void last(){
System
.out
.println("去公司工作");
}
public final void work(){
first();
second();
if(isWorkDay()){
last();
}
}
protected boolean isWorkDay(){
return true;
}
}
class NormalWorker extends WorkTemplate{
@Override
public void second() {
System
.out
.println("洗漱、吃早饭");
}
}
class RestDay extends WorkTemplate{
@Override
public void second() {
System
.out
.println("躺下");
}
@Override
public boolean isWorkDay(){
return false;
}
}
public class Template {
public static void main(String
[] args
) {
System
.out
.println("========工作日==========");
WorkTemplate normal
= new NormalWorker();
normal
.work();
System
.out
.println("========休息日==========");
WorkTemplate rest
= new RestDay();
rest
.work();
}
}
这里,我利用工作日和休息日的区别来说明,由此可见,可以把人每天的行为抽象并按照一定的顺序放到抽象类中。而具体的行为可以在子类中实现,如果需要扩展,只需继承模板抽象类即可,当然这里只是举了一个简单的例子,到真正设计模板类的时候一定要考虑周全,后期这个模板类尽量必去更改。
3、总结
优点 (1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。 (2)代码复用的基本技术,在数据库设计中尤为重要。 (3)存在一种反向的控制结构,通过一个父类调用其子类的操作,通过子类对父类进行扩展增加新的行为,符合“开闭原则”。
不足 每个不同的实现都需要定义一个子类,会导致类的个数增加,系统更加庞大。
作者在学习的时候,看到这一篇文章,写的十分细致,如果想要深入研究可参考:https://www.cnblogs.com/wangkaihua/p/9123171.html#autoid-3-4-0