模板方法
This commit is contained in:
@@ -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();
|
||||
}
|
||||
@@ -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学习课程源码");
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user