依赖倒置原则
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
package top.fjy8018.designpattern.principle.dependenceinversion.after;
|
||||
|
||||
/**
|
||||
* 学习课程接口
|
||||
* 接口作为抽象存在,成为一个契约
|
||||
* 面向抽象编程比面向具体实现细节编程实现简单,灵活度高
|
||||
*
|
||||
* @author F嘉阳
|
||||
* @date 2018-09-18 17:19
|
||||
*/
|
||||
public interface DCourse {
|
||||
void study();
|
||||
}
|
||||
@@ -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课程");
|
||||
}
|
||||
}
|
||||
@@ -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课程");
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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课程");
|
||||
}
|
||||
}
|
||||
@@ -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课程");
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user