原理或定義
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
结构
抽象模板(Abstract Template):定义了一个或多个抽象操作,以便让子类实现。
具体模板(Concrete Template):实现父类所定义的一个或多个抽象方法
抽象模板中方法的定義
基本方法:
也叫做基本操作,由子类实现的方法,并且在模板方法被调用。
模板方法:
可以有一个或几个, 一般是具体方法,也就是骨架,实现对基本方法的调度,完成固定的逻辑.为了防止恶意操作, 一般模板方法会加上final关键字,不允许被覆写。
钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类决定某些算法步骤是否挂钩在抽象类算法中。
類圖
代码
Abstract Template:
abstract class AbstractClass
{
//模板方法
public void TemplateMethod()
{
Method1();
Method2();
if(Method3()){
Method4();
}
}
//基本方法—具体方法
public final void Method1()
{
//实现代码
}
//基本方法—抽象方法
public abstract void Method2();
//基本方法—钩子方法
public boolean Method3()
{ return true; }
//基本方法—具体方法
public final void Method4()
{
//实现代码
}
}
具体模板(Concrete Template):
class ConcreteClass : AbstractClass
{
public override void Method2()
{
//实现代码
}
public override boolean Method3()
{
return fales;
}
}
使用場景
1.多个子类有公共方法,并且逻辑基本相同
2.对复杂的算法,核心算法设计为模板方法,细节功能则由各个子类实现
3.重构代码
優缺點
主要优点有:
1.封装不变部分,扩展可变部分
2.提取公共部分代码,便于维护
3.行为由父类控制,子类实现