diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourse.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourse.java new file mode 100644 index 0000000..8f991bc --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourse.java @@ -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("制作视频"); + } + + /** + * 可选行为 + *

+ * 手记可写可不写,但写的手记的流程还是一致的,故也声明为final + * 通过定义钩子方法,允许子类覆盖 + */ + final void writeArticle() { + log.info("编写手记"); + } + + /** + * 钩子方法,提供默认实现 + * + * @return + */ + protected boolean needWriteArticle() { + return false; + } + + /** + * 必须实现的行为 + * 课程内容打包 + */ + abstract void packageCourse(); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/JavaCourse.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/JavaCourse.java new file mode 100644 index 0000000..c7c2b9b --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/JavaCourse.java @@ -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学习课程源码"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/VueCourse.java b/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/VueCourse.java new file mode 100644 index 0000000..aa8d122 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/VueCourse.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; + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourseTest.java b/src/test/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourseTest.java new file mode 100644 index 0000000..7a3c53d --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourseTest.java @@ -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(); + } +} \ No newline at end of file