史诗级废话文讲清楚模板设计模式

前言:

本篇文章电子版和配套代码下载址(欢迎star):

https://github.com/hanshuaikang/design-pattern-java

模板方法定义:

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

优缺点:

优点:

  1. 封装不变部分,扩展可变部分。
  2. 提取公共代码,便于维护。
  3. 行为由父类控制,子类实现。

缺点:

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

应用场景:

  1. 有多个子类共有的方法,且逻辑相同。
  2. 重要的、复杂的方法,可以考虑作为模板方法。
  3. Spring 中提供的数据库操作模板RedisTemplate,Hibernatetemplete 等都是模板设计模式的应用。

微剧场:

阿呆一直觉得自己的出生就是为了弥补自己父亲年轻时未来得及完成的遗憾,二呆也是。

阿呆父亲从小的梦想就是当一名宇航员,可是生不逢时,那个时代喜之郎果冻还没有发明出来,慢慢地,这个梦想实现的可能性随着阿呆父亲年龄的增长而变得愈发微小,当阿呆父亲过完自己xx岁生日的那天,他意识到宇航员这三个字就注定和他肉眼可见的未来产生不了任何关系了。于是阿呆父亲选择在自己梦想破灭的第二年成为一名机械加工厂的普通工人,人生就是这样的,有时候事业上的失意往往伴随着婚姻上的幸福,在这一点阿呆父亲是幸运的,他遇到了自己生命中最重要的那个人,并且在随后的生活中有了两个可爱懂事的孩子,渐渐地,阿呆父亲当宇航员的梦想随着阿呆和二呆的出生逐渐在记忆中渐渐苏醒了,并且意志坚定一发不可收拾。之后阿呆父亲为阿呆和二呆制定了详细的人生规划,涵盖了小学初中高中大学等人生所有的重大节点。虽然在具体实施的细节上,阿呆父亲并不刻意要求,只要大体方向不变就好了,而这个规划阿呆父亲也是不容许任何一个人去篡改和干预的,即使阿呆和二呆也不能干预,每当阿呆和二呆表示不满的时候,阿呆父亲总是以一句“你们小孩子懂什么”而草草收场,终于在阿呆21岁二呆20岁那年,他们来到了未来国度职业分配局(尼玛还是个科幻题材?),当领到喜之郎果冻的那一刹那,阿呆父亲留下了喜悦的泪水。但是事以愿违,未来国度职业分配局工作人员很遗憾的表示目前未来星际并不需要航天员,于是未来国度便暂时把阿呆和二呆分配到了某家互联网公司去做程序员(就是现在这家),并承若日后一旦有名额就把阿呆和二呆分配到未来星际航天局去做宇航员。

看完这个故事是不是突然发现莫名有点像模板设计模式?

我,尼,,哪里像了?韩数,你自己看看,哪里像了???!

哎,别慌嘛,且听我一一道来。我们来看故事中阿呆父亲这个角色,是不是符合模板模式定义中的抽象类角色,定义了最基础的方法和执行框架,但是具体的实现是交给子类来完成的,但是最终子类也就是阿呆二呆他们的人生规划,却是使用的阿呆父亲的那一套,而不是阿呆自己的人生规划。

所以模板模式可以这么理解,阿呆他爸给阿呆计划了先上小学然后初中然后高中,但是具体怎么上的阿呆他爸不管,但是必须的按照我的这个计划来。

所以上文模板设计模式的优点,行为由父类控制,子类实现 就体现在这里,同时呢,缺点也显而易见了,如果过分点,阿呆父亲有一百万个梦想,那他岂不是得生一百万个孩子出来,很明显的会导致类的个数增加,使得系统更加庞大。

理解了基础的概念呢,老规矩,我们下面看代码实现。

对了,本故事纯属虚构,还有喜之郎果冻看到的话别忘了打钱。

代码实战:

首先我们定义一个抽象类,Father,这里定义了一系列人生的关键节点以及执行的顺序。

public abstract class Father {


abstract void primarySchool();//上小学
abstract void juniorHighSchool();//上初中
abstract void highSchool();//上高中
abstract void university();//上大学
abstract void astronaut();//成为宇航员

//为阿呆规划的人生道路
public final void step() {
primarySchool();
juniorHighSchool();
highSchool();
university();
astronaut();
}


}

然后定义一个阿呆类,ADai,用来具体实现Father类所定义的方法。

public class ADai extends Father {

@Override
void primarySchool() {
System.out.println("阿呆开始上小学了");

}

@Override
void juniorHighSchool() {
System.out.println("时间荏苒,阿呆已经是一个初中生了");

}

@Override
void highSchool() {
System.out.println("三年奋战,阿呆终于考上了自己理想的职高");
}

@Override
void university() {
System.out.println("十九岁的阿呆站在蓝翔技校的门口,相信自己会有一个美好的未来");
}

@Override
void astronaut() {
System.out.println("在厚厚的头盔中,阿呆俯视着脚下这颗蓝色的星球,瞬间感觉自己是多么的渺小");

}

}

测试:

public class Test {

public static void main(String[] args) {
ADai adai = new ADai();
adai.step();
}

}

输出:

阿呆开始上小学了
时间荏苒,阿呆已经是一个初中生了
三年奋战,阿呆终于考上了自己理想的职高
十九岁的阿呆站在蓝翔技校的门口,相信自己会有一个美好的未来
在厚厚的头盔中,阿呆俯视着脚下这颗蓝色的星球,瞬间感觉自己是多么的渺小

总结:

本篇笔记较为简单的阐述了模板设计模式的基本内容以及使用场景和代码形式,模板设计模式虽然简单,但是在实际开发中也有比较广泛的应用,配合微剧场,希望可以帮助正在学习设计模式的朋友可以更加深入的理解模板设计模式,只有真正的理解了设计模式,日常开发中我们才能够更好的使用。相关笔记电子版以配套代码以及上传开源至Github,欢迎star 。

我是韩数,我们下篇MVC设计模式再见,

暂无评论

文艺中二理工男,技术极客程序员

发表评论