依赖倒置原则

This commit is contained in:
2018-09-18 17:53:33 +08:00
parent 6a72751bd4
commit a79acaa570
13 changed files with 254 additions and 3 deletions

View File

@@ -0,0 +1,13 @@
package top.fjy8018.designpattern.principle.dependenceinversion.after;
/**
* 学习课程接口
* 接口作为抽象存在,成为一个契约
* 面向抽象编程比面向具体实现细节编程实现简单,灵活度高
*
* @author F嘉阳
* @date 2018-09-18 17:19
*/
public interface DCourse {
void study();
}

View File

@@ -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课程");
}
}

View File

@@ -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课程");
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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课程");
}
}

View File

@@ -0,0 +1,28 @@
package top.fjy8018.designpattern.principle.dependenceinversion.before;
import lombok.extern.slf4j.Slf4j;
/**
* 低层模块(模块被调用方)
* <p>
* 此时如果要加一个课程,必须修改该类
* 而对低层模块的修改应该尽量避免
*
* @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课程");
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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());
}
}

View File

@@ -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();
}
}

View File

@@ -2,15 +2,15 @@ package top.fjy8018.designpattern.principle.openclose;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.PrintStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import static org.junit.jupiter.api.Assertions.*;
/** /**
* 开闭原则单元测试 * 开闭原则单元测试
*
* 由于底层通过加锁实现,故生产环境严禁使用{@link PrintStream#println(String)}
*/ */
@Slf4j @Slf4j
class JavaCourseTest { class JavaCourseTest {