模板方法可以用来干嘛?
问题: 有3个方法:A、B、C三个方法,我想先执行A ,在执行B ,最后执行C,并且想在子类中重构B方法,所以问题就来了,我既想保证3个方法的执行顺序,又想在不同子类中重写B方法,有什么解决方法呢?
这就是模板方法,定义:
public abstract class ABC{
/**
* 模板方法
*/
public void main(){
//调用基本方法
A();
B();
C();
}
/**
* 基本方法(空方法)
*/
protected void A(){}
/**
* 基本方法的声明(由子类实现)
*/
protected abstract void B();
/**
* 基本方法(已经实现)
*/
private final void C(){
//业务相关的代码
}
}
在上述类ABC中:
- main方法是一个public的 方法,只有这个方法可以被外部调用,并且内部有调用各个方法,这些方法是有顺序性
- A方法、B方法都可以被子类重写,当然也可以在父类中填写A方法,作为一个默认的方法,
- C方法是一个固定的写完的方法,不能再子类中重写
这样一个方法定义好了
优点与缺点
优点:
- 使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求,封装不变部分,扩展可变部分;例如你装饰房子的方法有很多种,每一种都可能给你带来不一样的体验;
- 提取公共代码,有利于后期的维护;例如每个房间功能明确;
- 行为由父类控制,子类实现;比如定义了厨房这个房间,具体厨房要怎么装修,要看你的做法;
缺点:
- 如果算法流程有修改的话,则需要修改抽象类;影响所有子类。
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。其实我觉得这个都不算是缺点,因为模板方法相对于其他方法来说,类的个数都没有那么多。
参考博客
模板方法模式(Template Method) - 最易懂的设计模式解析[Java设计模式]3.模板模式