一、模式简介
定义:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
场景:算法的整体步骤很固定,但其中个别部分易变时,可以将容易变的部分抽象出来,供子类实现。当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。
- 角色结构:
- 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。抽象方法:在抽象类中申明,由具体子类实现。具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
- 具体实现类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
二、模式实现
public abstract class AbstractBusinessBank { -> 抽象类
public final void action() { -> 模板方法,防止算法的轮廓和骨架被更改
number();
queue();
if (vip()) {
wait("客户是VIP,尊享VIP等候室");
}else{
wait("客户不是VIP,业务大厅等候");
}
business();
score();
}
protected void number() { -> 具体方法
System.out.println("相同步骤:办理业务前取号");
}
protected void queue() { -> 具体方法
System.out.println("相同步骤:办理业务前排队");
}
protected abstract void business(); -> 抽象方法
protected void score() { -> 具体方法
System.out.println("相同步骤:对服务人员评分");
}
protected abstract boolean vip(); -> 钩子方法
protected void wait(String content){ -> 具体方法
System.out.println(content);
}
}
public class ConcreteSaveBusinessBank extends AbstractBusinessBank { -> 具体实现类
@Override
protected void business() {
System.out.println("不同步骤:办理业务存钱");
}
@Override
protected boolean vip() {
return true;
}
}
public class ConcreteWithdrawBusinessBank extends AbstractBusinessBank{ -> 具体实现类
@Override
protected void business() {
System.out.println("不同步骤:办理业务取钱");
}
@Override
protected boolean vip() {
return false;
}
}
以客户到银行办理业务为例子,必经四大步骤:办理前取号、办理前排队、办理相关业务、办理后评分,其中取号、排队、评分都是固定的步骤,可以在抽象业务中实现,相关业务则因客户而异,可以是存钱、取钱、办卡等等,可以延迟到具体业务中实现。
AbstractBusinessBank save = new ConcreteSaveBusinessBank();
save.action();
AbstractBusinessBank withdraw = new ConcreteWithdrawBusinessBank();
withdraw.action();
网友评论