【浅谈设计模式】(13) : 模板方法模式--不以规矩,不能成方圆
前言
继续对浅谈设计模式系列的更新,每次更新一篇文章长的都要花一天时间去总结,现在慢慢的能抽出的时间也没有那么宽裕了。不过该系列也已将过半了,后面争取上半年将它更新完。
今天来学习行为型模式的第一种-模板方法。
🌈为你的简历而打工。
真正能给你撑腰的丰富的技能储备、足够的经济基础、持续的情绪稳定、可控的生活节奏、和那个打不败的自己。为你的简历打工,把时间花在正事上,变成自己打心底里喜欢的人
一、入门
按照制定好的模板来干事,比如交给你一份试题,按照模板填写自己的答案即可,只不过每个人填的内容不一样。对应业务场景就是,确定了业务逻辑的关键步骤及其执行顺序,但是某些步骤的具体实现还未知,或者某些步骤的实现与具体的环境有关。
模板方法模式 : 定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。
比如模板模式的下图中,规定了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 使用场景
算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
🚀 最后,模板方法貌似是学过来最简单的一种,也希望大家都能按照上面面试案例的第一个实现一样,都有一个好结果,感谢阅读!
转载自:https://juejin.cn/post/7202560190750965819