模板方法模式(由子类决定如何实现一个算法中的步骤)

源码地址 https://github.com/DingMouRen/DesignPattern
模板方法模式(由子类决定如何实现一个算法中的步骤)_第1张图片
模板方法模式.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();
    }
总结

优点:

  • 封装不变部分,扩展可变部分
  • 提取公共部分代码,便于维护
    缺点:会增加阅读代码的难度

你可能感兴趣的:(模板方法模式(由子类决定如何实现一个算法中的步骤))