likes
comments
collection
share

【浅谈设计模式】(13) : 模板方法模式--不以规矩,不能成方圆

作者站长头像
站长
· 阅读数 16

前言

继续对浅谈设计模式系列的更新,每次更新一篇文章长的都要花一天时间去总结,现在慢慢的能抽出的时间也没有那么宽裕了。不过该系列也已将过半了,后面争取上半年将它更新完。

今天来学习行为型模式的第一种-模板方法。

🌈为你的简历而打工。

真正能给你撑腰的丰富的技能储备、足够的经济基础、持续的情绪稳定、可控的生活节奏、和那个打不败的自己。为你的简历打工,把时间花在正事上,变成自己打心底里喜欢的人

一、入门

按照制定好的模板来干事,比如交给你一份试题,按照模板填写自己的答案即可,只不过每个人填的内容不一样。对应业务场景就是,确定了业务逻辑的关键步骤及其执行顺序,但是某些步骤的具体实现还未知,或者某些步骤的实现与具体的环境有关。

模板方法模式 : 定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。

比如模板模式的下图中,规定了1、2、3 三点,但每个小人些的答案不一样,我们规定好1、2、3这个固定流程后,在针对各个流程做具体的不同的实现。这就是模板方法模式。

【浅谈设计模式】(13) : 模板方法模式--不以规矩,不能成方圆

模板方法(Template Method)模式包含以下主要角色:

  • 抽象类:负责给出一个算法的轮廓和骨架,它由一个模板方法和若干个基本方法构成。
    • 模板方法:定义了算法的骨架,按某种顺序调用执行不同基本方法
    • 基本方法:是实现算法各个步骤的方法,又可分为三种:
      • 抽象方法:一个抽象方法由抽象类声明,由具体子类实现
      • 具体方法:具体方法可以由抽象类或其子类声明实现
      • 钩子方法:在抽象类种已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。一般用于逻辑判断,返回值是boolean,方法名是 isXxx
  • 具体子类:实现抽象类中所定义的抽象方法和钩子方法

二、面试案例实战

以面试流程为例,定义一个抽象类 AbstractMs , 通过它来定义我们方法执行的步骤,大概分为四步,第一步:打电话邀约;第二步:技术一面;第三步:技术二面;第四面:hr 面。

然后每个面试者都走这个流程,在这个公司的执行标准上,后面的开发实现人员就不用关心这个执行顺序,按照这个流程走即可。

【浅谈设计模式】(13) : 模板方法模式--不以规矩,不能成方圆

抽象类:

public abstract class AbstratMs {

    /**
     * 面试过程
     */
    public final void interviewProcess(){
        // 第一步 打电话约面试
        this.phone();
        // 第二步 一轮技术面
        this.ITOne();
        // 第三步 二轮技术面
        this.iTTow();
        // 第三步 HR面
        this.hr();
    }
    // 打电话约面试
    protected void phone() {
        System.out.println("打电话约面试时间");
    }

    protected abstract void ITOne();

    protected abstract void iTTow();

    protected abstract void hr();

}

具体类重写:

public class ConcertMan extends AbstratMs{
    @Override
    protected void ITOne() {
        System.out.println("这一面不难啊");
    }

    @Override
    protected void iTTow() {
        System.out.println("这面试官有点面善");
    }

    @Override
    protected void hr() {
        System.out.println("hr让我去谈薪");
    }
}
public class ConcertMan2 extends AbstratMs{
    @Override
    protected void ITOne() {
        System.out.println("面试题好难!");
    }

    @Override
    protected void iTTow() {
        System.out.println("没看到二面面试官,难道他请假了?");
    }

    @Override
    protected void hr() {
        System.out.println("hr 姐姐让我回去等通知?");
    }
}

客户端测试:

public class Test {
    public static void main(String[] args) {
        ConcertMan concertMan = new ConcertMan();
        concertMan.interviewProcess();
        ConcertMan2 concertMan2 = new ConcertMan2();
        concertMan2.interviewProcess();
    }
}

执行结果

【浅谈设计模式】(13) : 模板方法模式--不以规矩,不能成方圆

三、模板方法总结

3.1 优点:

提高代码复用性将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中。实现了反向控制通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制 ,并符合“开闭原则”。

3.2 缺点

对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。

3.3 使用场景

算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制

🚀 最后,模板方法貌似是学过来最简单的一种,也希望大家都能按照上面面试案例的第一个实现一样,都有一个好结果,感谢阅读!