合成复用原则

This commit is contained in:
2018-09-23 15:59:13 +08:00
parent 7b18f0dcf0
commit f021174da8
8 changed files with 118 additions and 1 deletions

View File

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

View File

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

View File

@@ -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数据库连接";
}
}

View File

@@ -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数据库连接";
}
}

View File

@@ -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数据库连接";
}
}

View File

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

View File

@@ -6,7 +6,7 @@ import java.util.HashMap;
import java.util.Map;
/**
* 李氏转换原则要求方法入参必须比父类范围更宽,返回值必须比父类更窄
* 里氏替换原则要求方法入参必须比父类范围更宽,返回值必须比父类更窄
*
* @author F嘉阳
* @date 2018-09-23 11:30

View File

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