模板方法
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