diff --git a/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/ADBConnection.java b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/ADBConnection.java new file mode 100644 index 0000000..7ab8cb3 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/ADBConnection.java @@ -0,0 +1,11 @@ +package top.fjy8018.designpattern.principle.compositionaggregation.after; + +/** + * 合成复用原则:要尽量使用组合,尽量不要使用继承 + * + * @author F嘉阳 + * @date 2018-09-23 15:50 + */ +public abstract class ADBConnection { + public abstract String getConnection(); +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/AProductDao.java b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/AProductDao.java new file mode 100644 index 0000000..629bd29 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/AProductDao.java @@ -0,0 +1,26 @@ +package top.fjy8018.designpattern.principle.compositionaggregation.after; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2018-09-23 15:51 + */ +@Slf4j +public class AProductDao { + + private final ADBConnection connection; + + /** + * 通过构造器注入,解除继承关系,同时符合里氏替换原则和开闭原则 + * + * @param connection + */ + public AProductDao(ADBConnection connection) { + this.connection = connection; + } + + public void addProduct() { + log.info("使用{}", connection.getConnection()); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/MysqlConnection.java b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/MysqlConnection.java new file mode 100644 index 0000000..62db930 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/MysqlConnection.java @@ -0,0 +1,12 @@ +package top.fjy8018.designpattern.principle.compositionaggregation.after; + +/** + * @author F嘉阳 + * @date 2018-09-23 15:56 + */ +public class MysqlConnection extends ADBConnection { + @Override + public String getConnection() { + return "MySQL数据库连接"; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/OracleConnection.java b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/OracleConnection.java new file mode 100644 index 0000000..b95eb98 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/after/OracleConnection.java @@ -0,0 +1,12 @@ +package top.fjy8018.designpattern.principle.compositionaggregation.after; + +/** + * @author F嘉阳 + * @date 2018-09-23 15:57 + */ +public class OracleConnection extends ADBConnection { + @Override + public String getConnection() { + return "Oracle数据库连接"; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/before/DBConnection.java b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/before/DBConnection.java new file mode 100644 index 0000000..babe130 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/before/DBConnection.java @@ -0,0 +1,13 @@ +package top.fjy8018.designpattern.principle.compositionaggregation.before; + +/** + * 合成复用原则:要尽量使用组合,尽量不要使用继承 + * + * @author F嘉阳 + * @date 2018-09-23 15:50 + */ +public class DBConnection { + public String getConnection() { + return "MySQL数据库连接"; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/before/ProductDao.java b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/before/ProductDao.java new file mode 100644 index 0000000..019b967 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/principle/compositionaggregation/before/ProductDao.java @@ -0,0 +1,17 @@ +package top.fjy8018.designpattern.principle.compositionaggregation.before; + +import lombok.extern.slf4j.Slf4j; + +/** + * 直接使用继承,属于聚合关系,业务变更困难 + * + * @author F嘉阳 + * @date 2018-09-23 15:51 + */ +@Slf4j +public class ProductDao extends DBConnection { + + public void addProduct() { + log.info("使用{}", super.getConnection()); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/principle/liskovsubstitution/method/input/after/Child.java b/src/main/java/top/fjy8018/designpattern/principle/liskovsubstitution/method/input/after/Child.java index 9e3932f..6c6101f 100644 --- a/src/main/java/top/fjy8018/designpattern/principle/liskovsubstitution/method/input/after/Child.java +++ b/src/main/java/top/fjy8018/designpattern/principle/liskovsubstitution/method/input/after/Child.java @@ -6,7 +6,7 @@ import java.util.HashMap; import java.util.Map; /** - * 李氏转换原则要求方法入参必须比父类范围更宽,返回值必须比父类更窄 + * 里氏替换原则要求方法入参必须比父类范围更宽,返回值必须比父类更窄 * * @author F嘉阳 * @date 2018-09-23 11:30 diff --git a/src/test/java/top/fjy8018/designpattern/principle/compositionaggregation/before/ProductDaoTest.java b/src/test/java/top/fjy8018/designpattern/principle/compositionaggregation/before/ProductDaoTest.java new file mode 100644 index 0000000..28fc2e6 --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/principle/compositionaggregation/before/ProductDaoTest.java @@ -0,0 +1,26 @@ +package top.fjy8018.designpattern.principle.compositionaggregation.before; + +import org.junit.jupiter.api.Test; +import top.fjy8018.designpattern.principle.compositionaggregation.after.AProductDao; +import top.fjy8018.designpattern.principle.compositionaggregation.after.MysqlConnection; +import top.fjy8018.designpattern.principle.compositionaggregation.after.OracleConnection; + +import static org.junit.jupiter.api.Assertions.*; + +class ProductDaoTest { + + @Test + void before() { + ProductDao productDao = new ProductDao(); + productDao.addProduct(); + } + + @Test + void after() { + // 变更交由业务层决定 + AProductDao productDao1 = new AProductDao(new MysqlConnection()); + productDao1.addProduct(); + AProductDao productDao2 = new AProductDao(new OracleConnection()); + productDao2.addProduct(); + } +} \ No newline at end of file