模板方法模式:照着抄是不会有错滴!

生命甚或生活都源于模板,从我们出生到人生的各个阶段,都会不断的继承各种模板,父母的循循善诱,老师的谆谆教诲,社会上的鞭策砥砺。以上这些似乎都教会我们要遵循某种模板。也许正是有了这些模板我们才会少走弯路,少犯错误,才会让我们一步一步走的更踏实。

还是少说鸡汤多干正事儿。今天介绍的这个模板方法模式可以说是众多设计模式中最简单最常用的一种设计模式,但是要用好它的确需要认真研究一下的。

模板方法模式定义

官方定义:定义一个算法操作骨架,将一些步骤延迟到子类中去,使得子类可以在不改变算法结构的情况下,重新定义算法的特定步骤。
通俗释义:官方定义比较清晰,也就是说模板框架由父类定义,而子类继承并重写方法。框架设定好后,实现细节在自己身上完成。
模板方法模式通用类图
抽象类(AbstractClass)声明了算法步骤的基本方法,以及调用这些基本方法的模板方法,抽象类中也可以有自己的一些公共实现方法,模板方法中也可以定义一些公共的前置或者后置处理逻辑。
具体子类可以重新父类所有基本步骤方法,但不能重新模板方法。

模板方法通用代码

/**
 * @Description:抽象模板类
 */
public abstract class AbstractTemplate {

    protected abstract void stepMethod1();

    protected abstract void stepMethod2();

    protected abstract void stepMethod3();

    public void templateMethod(){
        //处理其他逻辑

        this.stepMethod1();
        this.stepMethod2();
        this.stepMethod3();

        //处理其他逻辑
    }
}

以上的AbstractTemplate包含两部分内容。
基本方法:也就是定义的stepMethod1(),stepMethod2(),stepMethod3(),这几个方法由子类实现,并且在模板方法里面被调用。一般采用protected类型。
模板方法:一般一个,也可以有多个,此方法为一个框架方法,调用基本方法完成固定的业务逻辑。

/**
 1. @Description:人类服务类,实现模板方法以及具体基本方法
 */
public class HumanService extends AbstractTemplate {

    @Override
    protected void stepMethod1() {
        System.out.println("人类起床");
    }

    @Override
    protected void stepMethod2() {
        System.out.println("人类工作");
    }

    @Override
    protected void stepMethod3() {
        System.out.println("人类睡觉");
    }
}
/**
 2. @Author: Max
 3. @Date: 2020-09-06 22:31
 4. @Description:机器人的服务,实现模板方法及其具体操作
 */
public class RobotService extends AbstractTemplate {

    @Override
    protected void stepMethod1() {
        System.out.println("机器人陪伴起床");
    }

    @Override
    protected void stepMethod2() {
        System.out.println("机器人陪伴工作");
    }

    @Override
    protected void stepMethod3() {
        System.out.println("机器人陪伴睡觉");
    }
}
/**
 5. @Description:模板方法客户端
 */
public class TempClient {

    public static void main(String[] args) {

        AbstractTemplate human = new HumanService();
        AbstractTemplate robot = new RobotService();
        //调用模板方法
        human.templateMethod();
        robot.templateMethod();
    }
}

上面定义并实现了模板类的两个子类,分别是人类日常服务类,机器人日常服务类,具体实现随意mock,能说明问题就行。以上就是模板方法模式的基本通用设计代码。从代码的设计角度来看,还是比较清晰简单的。

模板方法应用场景

模板方法模式就是按照一定的规则顺序调用基本方法,所以我们在使用的过程中需要考虑是否有以下几种情况:

  1. 多个类有公共的处理方法和并且逻辑步骤大致相同的时候,那么就可以抽象一个父类来定义这种算法的骨架。
  2. 需要为子类提供算法核心步骤,而具体的复杂算法细节由子类实现,这时就可以采用模板方法模式。
  3. 在重构代码的时候,可以把相同的代码抽取到父类中,然后定义具体步骤,利用钩子函数约束子类行为。利用模板方法模式重构代码还是比较常用的。

模板方法优缺点

优点

  • 封装不变,扩展可变。
    父类将不变的算法步骤封装,子类继承扩展这些算法步骤。父类控制这些算法执行步骤,子类负责实现。
  • 代码可维护。
    将散落的代码抽取到父类,否则的话全交给子类去独立维护,那么是一个非常吃力而且如果修改,则要修改很多相似的地方,稍微有点纰漏就会出现bug。
    缺点
  • 虽说有模板很实用,但是往往又会受限于这些模板骨架。
  • 如果步骤调整或者增加步骤,那么代码的改动也是比较大的。

模板方法经典应用

模板方法模式在Java中的经典应用还是蛮多的,下面就列举出常见的几种使用了模板方法的类。

java.io.InputStream
java.io.OutputStream
java.util.AbstractMap
javax.servlet.http.HttpServlet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值