| 源码地址 | https://github.com/DingMouRen/DesignPattern |
|---|
模板方法模式.png
- AbsTemplate抽象类,定义一套算法框架
- ComcreteImplA ComcreteImplB 具体实现类
定义
模板方法模式定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法结构,子类可以重写算法中某些特定步骤。
使用场景
- 多个子类有公有的方法,并且逻辑基本相同时
- 复杂的算饭,将核心算法设计为模板方法,周边的相关细节功能由各个子类实现
- 重构时,经常使用模板方法模式,将相同的代码抽取到父类中,然后通过钩子约束其行为
举个栗子
我们都会登录计算机,登录计算机基本都是相同的步骤。但是不同的计算机,可能启动时开启的具体软件是不同的,
//Template模板类
public abstract class AbstractComputer {
//启动计算机固定步骤:开启电源、硬件检查、加载系统、用户登录,用final休息,不让子类修改
public final void startUp(){
powerOn();
checkHardware();
loadOS();
login();
hook();//钩子
System.out.println("登录后。。。。。。,然后就关机了");
}
private void powerOn() {
System.out.println("开启电源");
}
//检查硬件
protected abstract void checkHardware();
//加载系统
protected abstract void loadOS();
//用户登录
protected abstract void login();
/**
* 钩子:默认不做事的方法,子类根据情况决定要不要覆盖。
* 例子:假如算法模板中有一个方法需要在一个条件允许下才能执行,这里hook()返回boolean值,这里hook()方法的实现就是去检验
* 条件是否允许
*/
protected void hook(){
}
}
//子类来实现算法中的某些步骤
public class CoderComputer extends AbstractComputer {
@Override
protected void checkHardware() {
System.out.println(getClass().getSimpleName()+"检查硬件");
}
@Override
protected void loadOS() {
System.out.println(getClass().getSimpleName()+"加载linux系统");
}
@Override
protected void login() {
System.out.println(getClass().getSimpleName()+"进行用户和密码验证");
}
}
使用
public static void main(String[] args) {
AbstractComputer computer = new CoderComputer();
computer.startUp();
computer = new MilitaryComputer();
computer.startUp();
}
总结
优点:
- 封装不变部分,扩展可变部分
- 提取公共部分代码,便于维护
缺点:会增加阅读代码的难度










网友评论