源代码
GitHub源代码
1.本文目标
本文目标是为了让大家认识并理解模板方法模式
2.基本套路
定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
类型:行为型
选择关键点:算法骨架是否牢固
设计原则:破坏里氏替换,体现功能复用
使用概率:80%
难度系数:中低
3.适用场景
1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
2.各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复
4.使用步骤
用栗子能更好的说明问题,请继续往下看
5.举个栗子
我们用具体的代码去更好的理解这个设计模式
5.1栗子说明
- 背景:录制视频都需要编写ppt,制作视频和写手记,然后用这个模板制作不同的课程
- 目的:通过模板方法去制作
5.2使用步骤
实现代码如下:
步骤1.创建课程抽象类
public abstract class ACourse {
//模板方法 制作课程
protected final void makeCourse(){
this.makePPT();
this.makeVideo();
if(needWriteArticle()){
this.writeArticle();
}
this.packageCourse();
}
final void makePPT(){
System.out.println("制作PPT");
}
final void makeVideo(){
System.out.println("制作视频");
}
final void writeArticle(){
System.out.println("编写手记");
}
//钩子方法
protected boolean needWriteArticle(){
return false;
}
//包装课程
abstract void packageCourse();
}
步骤2.创建设计模式课程,继承抽象课程类
public class DesignPatternCourse extends ACourse {
@Override
void packageCourse() {
System.out.println("提供课程Java源代码");
}
@Override
protected boolean needWriteArticle() {
return true;
}
}
步骤3.创建前端课程,继承抽象课程类
public class FECourse extends ACourse {
private boolean needWriteArticleFlag = false;
@Override
void packageCourse() {
System.out.println("提供课程的前端代码");
System.out.println("提供课程的图片等多媒体素材");
}
public FECourse(boolean needWriteArticleFlag) {
this.needWriteArticleFlag = needWriteArticleFlag;
}
@Override
protected boolean needWriteArticle() {
return this.needWriteArticleFlag;
}
}
步骤4. 测试
public static void main(String[] args) {
System.out.println("设计模式课程start---");
ACourse designPatternCourse = new DesignPatternCourse();
designPatternCourse.makeCourse();
System.out.println("设计模式课程end---");
System.out.println("前端课程start---");
ACourse feCourse = new FECourse(false);
feCourse.makeCourse();
System.out.println("前端课程end---");
}
6.优点
- 提高复用性
- 提高扩展性
- 符合开闭原则
7.缺点
- 类数目的增加
- 增加了系统实现的复杂度
- 继承关系自身缺点,如果父类添加新的抽象方法,所有的子类都要改一遍
8.总结
本文只是对模板方法模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。
网友评论