設計原則 - 合成複用原則

概念

  • 定義:儘量使用對象組合(contains-A)/聚合(has-A),而不是繼承關係達到軟件複用的目的
  • 優點:可以使系統更加靈活,降低類與類之間的耦合度,一個類的變化對其他類造成的影響相對較少
  • 合成複用是達到開閉原則的一種實現方式

編碼

實例

  • 數據庫連接
  • DBConnection.java
/**
 * @Description DB連接
 * @date Dec 19, 2021
 * @version 1.0
 */
public class DBConnection {

	/**
     * 獲取DB連接
     * @return
     */
    public String getConnection() {
        return "Mysql數據庫連接";
    }

}
  • ProductDao.java
/**
 * @Description 產品DAO
 * @date Dec 19, 2021
 * @version 1.0
 */
public class ProductDao extends DBConnection {

    /**
     * 添加產品
     */
    public void addProduct() {
        String conn = super.getConnection();
        System.out.println("使用" + conn + "增加產品");
    }

}
  • Test.java
/**
 * @Description 測試類
 * @date Dec 19, 2021
 * @version 1.0
 */
public class Test {

    public static void main(String[] args) {
        ProductDao productDao = new ProductDao();
        productDao.addProduct();
    }

}
  • 輸出:
使用Mysql數據庫連接增加產品
  • 類圖如下:

在這裏插入圖片描述


合成複用原則

  • 實現數據庫連接的擴展性
  • DBConnection.java
/**
 * @Description DB連接
 * @date Dec 19, 2021
 * @version 1.0
 */
public abstract class DBConnection {

    /**
     * 獲取DB鏈接
     * @return
     */
    public abstract String getConnection();

}
  • MysqlConnection.java
/**
 * @Description Mysql連接
 * @date Dec 20, 2021
 * @version 1.0
 */
public class MysqlConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "Mysql數據庫連接";
    }
}
  • OracleConnection.java
/**
 * @Description Oracle連接
 * @date Dec 20, 2021
 * @version 1.0
 */
public class OracleConnection extends DBConnection {
    @Override
    public String getConnection() {
        return "Oracle數據庫連接";
    }
}
  • ProductDao.java
/**
 * @Description 產品DAO
 * @date Dec 19, 2021
 * @version 1.0
 */
 public class ProductDao {

    private DBConnection dbConnection;

    /**
     * setter注入
     * @param dbConnection
     */
    public void setDbConnection(DBConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

    /**
     * 添加產品
     */
    public void addProduct() {
        String conn = dbConnection.getConnection();
        System.out.println("使用" + conn + "增加產品");
    }

}
  • Test.java
/**
 * @Description 合成複用原則測試類
 * @author Coisini
 * @date Dec 19, 2021
 * @version 1.0
 */
public class Test {

    public static void main(String[] args) {
        ProductDao productDao = new ProductDao();
        productDao.setDbConnection(new MysqlConnection());
        productDao.addProduct();

        productDao.setDbConnection(new OracleConnection());
        productDao.addProduct();
    }

}
  • 輸出:
使用Mysql數據庫連接增加產品
使用Oracle數據庫連接增加產品
  • 類圖變化如下:

在這裏插入圖片描述


源碼


- End -
- 個人學習筆記 -

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章