模板方法
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
模板方法包含以下角色:
- 抽象类:负责给出一个算法的轮廓和骨架
- 模板方法包含了具体逻辑顺序
- 基本方法包含了抽象方法以及具体方法
- 具体子类:实现抽象类中所定义的方法,它们是一个顶级逻辑的组成步骤。
具体实现
例如去银行办理业务,需要取号、排队、办理具体业务等流程,其中取号、排队是必须经过的流程顺序,办理具体业务是抽象的,因人而异
1.创建抽象类Bank
public abstract class Bank {
//办理抽象业务
public abstract void Onbusiness();
//模板方法包含具体顺序逻辑
public void TemplateMethod()
{
//第一步:取号
Getnumber();
//第二步:排队
lineup();
//第三步:办理具体业务
Onbusiness();
}
public void Getnumber(){
System.out.println("先取号");
}
public void lineup()
{
System.out.println("再排队");
}
}
2.创建具体业务类实现接口
//基金业务
public class FundBusiness extends Bank{
@Override
public void Onbusiness() {
System.out.println("办理基金业务");
}
}
//存款业务
public class DepositBusiness extends Bank{
@Override
public void Onbusiness() {
System.out.println("办理存款业务");
}
}
3.客户端实现
public static void main(String[] args) {
DepositBusiness depositBusiness=new DepositBusiness();
depositBusiness.TemplateMethod();
System.out.println("--------------------------");
FundBusiness fundBusiness=new FundBusiness();
fundBusiness.TemplateMethod();
}
优点:模板模式提高了代码的复用性,把不变的行为放在父类中,而将不同的代码放入不同的子类中
缺点:对每个不同的实现都需要定义一个子类去实现接口,这会导致类的个数增加,系统更加庞大,设计也更加抽象
适用场景:
- 算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
- 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制