合成复用原则
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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数据库连接";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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数据库连接";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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数据库连接";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 李氏转换原则要求方法入参必须比父类范围更宽,返回值必须比父类更窄
|
* 里氏替换原则要求方法入参必须比父类范围更宽,返回值必须比父类更窄
|
||||||
*
|
*
|
||||||
* @author F嘉阳
|
* @author F嘉阳
|
||||||
* @date 2018-09-23 11:30
|
* @date 2018-09-23 11:30
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user