模板方法模式
模板设计模式(Template Method Pattern)是面向对象编程中的一种行为型设计模式。它定义了一个算法的骨架,将某些步骤推迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。
太抽象了
来我们换个说法,TFboys的青春修炼手册大家都听过,左手右手一个慢动作,整个歌曲的舞蹈大家都是熟悉的;但是我们每个人去实现整个舞蹈的时候又受限于自己的肢体协调性或者基础,跳出来的舞蹈又有这样那样的差异。但是这些舞蹈的整体流程又都是固定下来的,只有我们具体做动作的时候,不改变舞蹈流程,而且我们可以自己去实现舞蹈过程。这个过程就跟我们的模板设计模式很像。ok,也许你还是有点困惑,没关系,请耐心看完这篇文章,相信你一定能掌握模板方法设计模式。
talk is cheap, show you my code
模板方法是一个比较简单的设计模式,其核心思想在于我们要定义出一个算法的骨架,对于有一些具体确定不下来的步骤就交给子类去实现。
青春修炼手册 - YouthTrainingManual
跟着我 - follow me
左手右手一个慢动作 - Left hand, right hand, one slow motion
public class YouthTrainingManual {
public final String dance() {
String res = followMe();
String res1 = leftHandRightHandOneSlowMotion();
if (res.equals("good") && res1.equals("good")) {
return "good dancer";
}
return "just so so ";
}
private String followMe() {
// 开始 跟着我
// 不同基础的人 的实现舞蹈会有差异
}
private String leftHandRightHandOneSlowMotion() {
// 开始左手右手一个慢动作
// 不同基础的人 的实现舞蹈会有差异
}
}
但是这样 followMe() 跟leftHandRightHandOneSlowMotion() 都没有实现,编译的时候会失败怎么办? 我们不知道你怎么左手右手一个慢动作哎,这也没法写实现啊!
怎么办?
还记得抽象类吗?下面我带你复习一下抽象类的知识点。
抽象类
抽象类(Abstract Class)是面向对象编程中的一个重要概念,它允许开发者定义一个包含抽象方法和具体方法的类。抽象类不能被实例化,即你不能创建一个抽象类的对象,但可以创建它的子类,并且这些子类必须实现抽象类中所有的抽象方法。
抽象类概述
- 定义:抽象类是一种特殊的类,它可以包含普通的方法和字段,也可以包含没有具体实现的抽象方法。抽象类使用 abstract 关键字来声明。
- 目的:提供一个通用的基类,为多个子类共享代码和定义共同的行为,同时允许每个子类根据自己的需求实现特定的行为。
抽象类的特点
- 抽象方法
- 定义:抽象方法是没有方法体的方法,只有方法签名。它们必须在非抽象的子类中被实现。
- 语法:在 Java 中,抽象方法用 abstract 关键字修饰,后面不跟方法体 {}。
- 具体方法
- 定义:除了抽象方法外,抽象类还可以包含具体的方法,这些方法有完整的方法体,并且可以直接在抽象类中调用或由子类继承。
改造代码
已经复习完抽线类的概念,我们再来看一下我们的上面的代码,以及我们要实现的效果。我们要的效果不就是dance()有规定的实现流程,followMe()跟leftHandRightHandOneSlowMotion()有各自的实现效果吗。
public abstract class YouthTrainingManual {
public final String dance() {
String res = followMe();
String res1 = leftHandRightHandOneSlowMotion();
if (res.equals("good") && res1.equals("good")) {
return "good dancer";
}
return "just so so ";
}
abstract String followMe();
abstract String leftHandRightHandOneSlowMotion();
}
不同的子类实现不同的效果
子类1是 Wangjunkai
public class WJK extends YouthTrainingManual {
@Override
String followMe() {
return "good";
}
@Override
String leftHandRightHandOneSlowMotion() {
return "good";
}
}
子类2 是粉丝
public class Fs extends YouthTrainingManual{
@Override
String followMe() {
return "just so so";
}
@Override
String leftHandRightHandOneSlowMotion() {
return "just so so";
}
}
public class Test32 {
public static void main(String[] args) {
YouthTrainingManual youthTrainingManual = new WJK();
YouthTrainingManual youthTrainingManual1 = new Fs();
System.out.println(youthTrainingManual.dance());
System.out.println(youthTrainingManual1.dance());
}
}
输出结果:
good dancer
just so so
这样我们实现了两个人都是跳青春修炼手册,王俊凯dance的好一点,粉丝dance的just so so。
总结
我们通过上面的这个案例,让大家了解了模板方法设计模式。这个模式的核心思想是父类定义主干流程,子类负责细节的实现。同时为了防止子类重写父类的主干流程方法,我们可以把主干流程方法设置为final关键字,这个final关键字用于方法的效果是子类不能更改父类的实现。对final关键字不了解的同学,可以看一下我的这篇文章关键字。对于子类需要实现的抽象方法,我们一般使用protected关键字修饰,这样的话,外部客户端就不可见这些方法了。