模式定义:
定义一个操作中算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模式结构
代码实现-抽象类
public abstract class BankTemplateMethod {
public void takeNumber(){
System.out.println("取号");
}
public abstract void transact();//具体业务
public void evaluate(){
System.out.println("反馈评价");
}
public final void process(){
takeNumber();
transact();
evaluate();
}
}
public class Drawback extends BankTemplateMethod {
@Override
public void transact() {
System.out.println("取钱");
}
}
public class Client {
public static void main(String[] args) {
Drawback drawback = new Drawback();
drawback.process();
System.out.println("-----------");
BankTemplateMethod saveBack = new BankTemplateMethod() {
@Override
public void transact() {
System.out.println("存钱");
}
};
saveBack.process();
}
}
代码实现-回调
public class BankTemplateMethod {
public void takeNumber() {
System.out.println("取号");
}
public void evaluate() {
System.out.println("反馈评价");
}
public final void process(BackBizCallBack callBack) {
takeNumber();
callBack.transact();//具体业务实现抽取到接口中
evaluate();
}
}
public interface BackBizCallBack {
public void transact();//具体业务
}
public class Client {
//取钱
public static void draw() {
new BankTemplateMethod().process(new BackBizCallBack() {
public void transact() {
System.out.println("取钱");
}
});
}
//挂失
public static void loseCard() {
new BankTemplateMethod().process(new BackBizCallBack() {
public void transact() {
System.out.println("挂失卡");
}
});
}
public static void main(String[] args) {
draw();
System.out.println("----------------------");
loseCard();
}
}
模式的优缺点
模式的优点
- 实现代码复用。
模式的缺点
- 算法骨架不容易升级。
思考
模式本质:固定算法骨架。
开发中的应用场景:
需要固定定义算法骨架,实现一个算法的不变部分,并把可变的行为留给子类来实现的情况。
各个子类中具有公共行为,应该抽取出来,集中在一个公共类中去实现,从而避免代码的重复。
需要控制子类扩展的情况。模版方法模式会在特定的点来调用子类的方法,这样只允许在这些点进行扩展。