From a79acaa570369ae49646fe220fa3b20b27a9df29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Tue, 18 Sep 2018 17:53:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=80=92=E7=BD=AE=E5=8E=9F?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dependenceinversion/after/DCourse.java | 13 +++++++++ .../after/JavaDCourse.java | 17 +++++++++++ .../after/PythonDCourse.java | 17 +++++++++++ .../dependenceinversion/after/Student.java | 17 +++++++++++ .../dependenceinversion/after/Student2.java | 23 +++++++++++++++ .../dependenceinversion/after/Student3.java | 26 +++++++++++++++++ .../dependenceinversion/after/VueDCourse.java | 15 ++++++++++ .../dependenceinversion/before/Student.java | 28 +++++++++++++++++++ .../after/Student2Test.java | 18 ++++++++++++ .../after/Student3Test.java | 25 +++++++++++++++++ .../after/StudentTest.java | 26 +++++++++++++++++ .../before/StudentTest.java | 26 +++++++++++++++++ .../principle/openclose/JavaCourseTest.java | 6 ++-- 13 files changed, 254 insertions(+), 3 deletions(-) create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/DCourse.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/JavaDCourse.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/PythonDCourse.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/VueDCourse.java create mode 100644 src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/before/Student.java create mode 100644 src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2Test.java create mode 100644 src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3Test.java create mode 100644 src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/StudentTest.java create mode 100644 src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/before/StudentTest.java diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/DCourse.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/DCourse.java new file mode 100644 index 0000000..dc0d20e --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/DCourse.java @@ -0,0 +1,13 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +/** + * 学习课程接口 + * 接口作为抽象存在,成为一个契约 + * 面向抽象编程比面向具体实现细节编程实现简单,灵活度高 + * + * @author F嘉阳 + * @date 2018-09-18 17:19 + */ +public interface DCourse { + void study(); +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/JavaDCourse.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/JavaDCourse.java new file mode 100644 index 0000000..1ce4635 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/JavaDCourse.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +import lombok.extern.slf4j.Slf4j; + +/** + * 课程都面向接口,满足依赖倒置原则:高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象 + * + * @author F嘉阳 + * @date 2018-09-18 17:19 + */ +@Slf4j +public class JavaDCourse implements DCourse { + @Override + public void study() { + log.info("学习Java课程"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/PythonDCourse.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/PythonDCourse.java new file mode 100644 index 0000000..9009d41 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/PythonDCourse.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +import lombok.extern.slf4j.Slf4j; + +/** + * 所有课程实现类后面都不应该修改,添加新课程则增加新实现类,满足开闭原则 + * + * @author F嘉阳 + * @date 2018-09-18 17:19 + */ +@Slf4j +public class PythonDCourse implements DCourse { + @Override + public void study() { + log.info("学习Python课程"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student.java new file mode 100644 index 0000000..a798a6c --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +/** + * @author F嘉阳 + * @date 2018-09-18 17:20 + */ +public class Student { + + /** + * 具体学习哪个课程,交给高层模块通过参数注入 + * + * @param course 课程 + */ + public void studyCourse(DCourse course) { + course.study(); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2.java new file mode 100644 index 0000000..d9e9fde --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2.java @@ -0,0 +1,23 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +/** + * 构造器注入课程 + * + * @author F嘉阳 + * @date 2018-09-18 17:40 + */ +public class Student2 { + + private DCourse dCourse; + + public Student2(DCourse dCourse) { + this.dCourse = dCourse; + } + + /** + * 具体学习哪个课程,交给高层模块通过构造器注入 + */ + public void studyCourse() { + dCourse.study(); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3.java new file mode 100644 index 0000000..da57bf2 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3.java @@ -0,0 +1,26 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +/** + * Setter注入课程 + * + * @author F嘉阳 + * @date 2018-09-18 17:40 + */ +public class Student3 { + + private DCourse dCourse; + + public Student3() { + } + + /** + * 具体学习哪个课程,交给高层模块通过构造器注入 + */ + public void studyCourse() { + dCourse.study(); + } + + public void setdCourse(DCourse dCourse) { + this.dCourse = dCourse; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/VueDCourse.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/VueDCourse.java new file mode 100644 index 0000000..89bb6c1 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/after/VueDCourse.java @@ -0,0 +1,15 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-09-18 17:19 + */ +@Slf4j +public class VueDCourse implements DCourse { + @Override + public void study() { + log.info("学习Vue课程"); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/before/Student.java b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/before/Student.java new file mode 100644 index 0000000..046945c --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/dependenceinversion/before/Student.java @@ -0,0 +1,28 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.before; + +import lombok.extern.slf4j.Slf4j; + +/** + * 低层模块(模块被调用方) + *

+ * 此时如果要加一个课程,必须修改该类 + * 而对低层模块的修改应该尽量避免 + * + * @author F嘉阳 + * @date 2018-09-18 17:14 + */ +@Slf4j +public class Student { + + public void studyJavaCourse() { + log.info("学习Java课程"); + } + + public void studyPythonCourse() { + log.info("学习Python课程"); + } + + public void studyVueCourse() { + log.info("学习Vue课程"); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2Test.java b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2Test.java new file mode 100644 index 0000000..a80b30b --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student2Test.java @@ -0,0 +1,18 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * 依赖倒置构造器实现实现后单元测试 + * 高层模块 + */ +class Student2Test { + + @Test + void study() { + Student2 student = new Student2(new JavaDCourse()); + student.studyCourse(); + } +} \ No newline at end of file diff --git a/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3Test.java b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3Test.java new file mode 100644 index 0000000..812457a --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/Student3Test.java @@ -0,0 +1,25 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * 依赖倒置Setter实现实现后单元测试 + * 高层模块 + */ +class Student3Test { + + @Test + void study() { + Student3 student = new Student3(); + student.setdCourse(new JavaDCourse()); + student.studyCourse(); + + student.setdCourse(new PythonDCourse()); + student.studyCourse(); + + student.setdCourse(new VueDCourse()); + student.studyCourse(); + } +} \ No newline at end of file diff --git a/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/StudentTest.java b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/StudentTest.java new file mode 100644 index 0000000..8cee7dd --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/after/StudentTest.java @@ -0,0 +1,26 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.after; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * 依赖倒置接口方法实现后单元测试 + * 高层模块 + */ +class StudentTest { + + /** + * 修改后高层不依赖低层模块{@link Student}的实现 + * 此时如果高层模块要学多一门课程 + * 则不需要修改Student,直接增加一个实现{@link DCourse} 的接口课程即可 + * 实现了高层模块与低层模块的解耦 + */ + @Test + void study() { + Student student = new Student(); + student.studyCourse(new JavaDCourse()); + student.studyCourse(new PythonDCourse()); + student.studyCourse(new VueDCourse()); + } +} \ No newline at end of file diff --git a/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/before/StudentTest.java b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/before/StudentTest.java new file mode 100644 index 0000000..44cf315 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/principle/dependenceinversion/before/StudentTest.java @@ -0,0 +1,26 @@ +package top.fjy8018.designpattern.principle.dependenceinversion.before; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * 依赖倒置实现前单元测试 + * 高层模块(模块调用方) + */ +class StudentTest { + + /** + * 此时存在的问题: + * 如果高层模块要学多一门课程 + * 则低层模块{@link Student} 也要对应修改,即存在高层模块依赖低层模块,面向具体实现类编程 + */ + @Test + public void study() { + Student student = new Student(); + student.studyJavaCourse(); + student.studyPythonCourse(); + student.studyVueCourse(); + } + +} \ No newline at end of file diff --git a/src/test/java/top/fjy8018/designpattern/principle/openclose/JavaCourseTest.java b/src/test/java/top/fjy8018/designpattern/principle/openclose/JavaCourseTest.java index ac92524..844caa5 100644 --- a/src/test/java/top/fjy8018/designpattern/principle/openclose/JavaCourseTest.java +++ b/src/test/java/top/fjy8018/designpattern/principle/openclose/JavaCourseTest.java @@ -2,15 +2,15 @@ package top.fjy8018.designpattern.principle.openclose; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.PrintStream; import java.math.BigDecimal; -import static org.junit.jupiter.api.Assertions.*; /** * 开闭原则单元测试 + * + * 由于底层通过加锁实现,故生产环境严禁使用{@link PrintStream#println(String)} */ @Slf4j class JavaCourseTest {