模板方法

This commit is contained in:
2020-03-04 11:32:46 +08:00
parent ae6cc2ef17
commit bd76223a9e
4 changed files with 153 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
package top.fjy8018.designpattern.pattern.behavior.templatemethod;
import lombok.extern.slf4j.Slf4j;
/**
* 抽象课程
*
* @author F嘉阳
* @date 2020/3/4 10:59
*/
@Slf4j
public abstract class ACourse {
/**
* 固定不变的行为
* 定义模板,不允许子类覆盖,防止影响流程执行顺序
*/
protected final void makeCourse() {
this.makePPT();
this.makeVideo();
// 调用可选方法
if (needWriteArticle()) {
this.writeArticle();
}
this.packageCourse();
}
/**
* 固定不变的行为
* 满足所有子类需求
*/
final void makePPT() {
log.info("制作PPT");
}
final void makeVideo() {
log.info("制作视频");
}
/**
* 可选行为
* <p>
* 手记可写可不写但写的手记的流程还是一致的故也声明为final
* 通过定义钩子方法,允许子类覆盖
*/
final void writeArticle() {
log.info("编写手记");
}
/**
* 钩子方法,提供默认实现
*
* @return
*/
protected boolean needWriteArticle() {
return false;
}
/**
* 必须实现的行为
* 课程内容打包
*/
abstract void packageCourse();
}

View File

@@ -0,0 +1,21 @@
package top.fjy8018.designpattern.pattern.behavior.templatemethod;
import lombok.extern.slf4j.Slf4j;
/**
* 具体课程实现
*
* @author F嘉阳
* @date 2020/3/4 11:05
*/
@Slf4j
public class JavaCourse extends ACourse {
/**
* 必须实现的行为
* 课程内容打包
*/
@Override
void packageCourse() {
log.info("提供Java学习课程源码");
}
}

View File

@@ -0,0 +1,44 @@
package top.fjy8018.designpattern.pattern.behavior.templatemethod;
import lombok.extern.slf4j.Slf4j;
/**
* 具体课程实现
*
* @author F嘉阳
* @date 2020/3/4 11:06
*/
@Slf4j
public class VueCourse extends ACourse {
private boolean needWriteArticleFlag = false;
/**
* 通过构造器开放给实例决定
*
* @param needWriteArticleFlag
*/
public VueCourse(boolean needWriteArticleFlag) {
this.needWriteArticleFlag = needWriteArticleFlag;
}
/**
* 必须实现的行为
* 课程内容打包
*/
@Override
void packageCourse() {
log.info("提供Vue学习课程源码");
log.info("提供Vue学习课程多媒体素材");
}
/**
* 钩子方法,提供默认实现
*
* @return
*/
@Override
protected boolean needWriteArticle() {
return this.needWriteArticleFlag;
}
}

View File

@@ -0,0 +1,24 @@
package top.fjy8018.designpattern.pattern.behavior.templatemethod;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
/**
* @author F嘉阳
* @date 2020/3/4 11:08
*/
@Slf4j
class ACourseTest {
@Test
void makeJavaCourse() {
ACourse javaCourse = new JavaCourse();
javaCourse.makeCourse();
}
@Test
void makeVueCourse() {
ACourse vueCourse = new VueCourse(true);
vueCourse.makeCourse();
}
}