Java设计模式浅析
第一章 简单工厂模式
第二章 工厂方法模式
第三章 抽象工厂模式
第四章 单例模式
第五章 破坏单例模式
第六章 原型模式
第七章 代理模式
第八章 策略模式
第九章 模板模式
概述
模板模式又叫模板方法模式(Template Method Pattern),是指定义一个算法的骨架,
并允许子类为一个或者多个步骤提供实现。模板模式使得子类可以在不改变算法结构的情况下,
重新定义算法的某些步骤,属于行为型设计模式。
模板模式适用于以下场景:
- 一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
一、示例代码
抽象父类 NetworkCourse
package com.Design.TemplateMethod;
public abstract class NetworkCourse {
protected final void createCourse() {
// 发布预习资料
this.postPreResource();
// 制作课件PPT
this.createPPT();
// 在线直播
this.liveVideo();
// 提交课堂笔记
this.postNote();
// 提交源码
this.postSource();
// 布置作业,有些课程是没有作业的,有些课程是有作业的
// 如果有作业,检查作业,如果没有作业,流程结束
if (needHomework()) {
checkHomework();
}
}
private void postPreResource() {
System.out.println("发布预习资料");
}
private void createPPT() {
System.out.println("制作课件PPT");
}
private void liveVideo() {
System.out.println("在线直播");
}
private void postNote() {
System.out.println("提交源代码");
}
private void postSource() {
System.out.println("提交课件和笔记");
}
/**
* 钩子方法:实现流程的微调
*
* @return
*/
protected boolean needHomework() {
return false;
}
protected abstract void checkHomework();
}
子类 JavaCourse
package com.Design.TemplateMethod;
public class JavaCourse extends NetworkCourse {
@Override
//重写 checkHomework 方法
protected void checkHomework() {
System.out.println("检查Java的课堂作业");
}
}
子类 BigDataCourse
package com.Design.TemplateMethod;
public class BigDataCourse extends NetworkCourse {
private boolean needHomeworkFlag = false;
public BigDataCourse(boolean needHomeworkFlag) {
this.needHomeworkFlag = needHomeworkFlag;
}
@Override
protected boolean needHomework() {
//new对象时 传参给私有成员变量 private
//needHomework() 返回自定义的值
//needHomeworkFlag 在create方法中判断是否执行checkHomework()
return this.needHomeworkFlag;
}
@Override
protected void checkHomework() {
System.out.println("在create方法中检查大数据的课堂作业");
}
}
二、测试代码
package com.Design.TemplateMethod;
public class NetworkCourseTest {
public static void main(String[] args) {
//创建对象 再执行 createCourse()方法
System.out.println("---Java 架构师课程---");
NetworkCourse javaCourse = new JavaCourse();
javaCourse.createCourse();
System.out.println("---大数据课程---");
NetworkCourse bigDataCourse = new BigDataCourse(true);
bigDataCourse.createCourse();
}
}
总结
模板模式的优点如下:
- 利用模板模式将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
- 将不同的代码放到不同的子类中,通过对子类的扩展增加新的行为,可以提高代码的扩展性。
- 把不变的行为写在父类中,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。
模板模式的缺点如下:
- 每个抽象类都需要一个子类来实现,导致了类的数量增加。
- 类数量的增加间接地增加了系统的复杂性。
- 因为继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。