龙空技术网

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

IT知识分享官 124

前言:

现时大家对“抽象类中的方法必须都是抽象方法”大概比较重视,我们都需要学习一些“抽象类中的方法必须都是抽象方法”的相关内容。那么小编在网络上搜集了一些对于“抽象类中的方法必须都是抽象方法””的相关知识,希望朋友们能喜欢,姐妹们快快来学习一下吧!

前言

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

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

为你的简历而打工。

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

一、入门

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

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

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

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

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

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

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

抽象类:

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();    }}复制代码

执行结果

三、模板方法总结3.1 优点:

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

3.2 缺点

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

3.3 使用场景

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

标签: #抽象类中的方法必须都是抽象方法 #抽象类可以有方法的实现吗对吗