From bd76223a9e1f252ce218dbb26090d93088a932d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Wed, 4 Mar 2020 11:32:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../behavior/templatemethod/ACourse.java | 64 +++++++++++++++++++ .../behavior/templatemethod/JavaCourse.java | 21 ++++++ .../behavior/templatemethod/VueCourse.java | 44 +++++++++++++ .../behavior/templatemethod/ACourseTest.java | 24 +++++++ 4 files changed, 153 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourse.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/JavaCourse.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/VueCourse.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/behavior/templatemethod/ACourseTest.java 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