【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )
文章目錄
- 一、合成復用原則簡介
- 二、合成復用 與 繼承復用 優缺點
- 三、合成復用原則代碼示例
- 1、繼承復用代碼示例
- 2、合成復用代碼示例
一、合成復用原則簡介
合成復用原則 又稱為 組合復用原則 , 合成/聚合復用原則 , 組合/聚合復用原則 ;
合成復用原則定義 : 想要達到 軟件復用 的目的 , 盡量使用 對象 組合/聚合 , 而不是 繼承關系 ;
聚合 是 has-A 關系 ; ( 關系較弱 ) 代表部分事物的對象 ( 次 ) 與 代表聚合事物的對象 ( 主 ) 生命周期無關 , 刪除了聚合對象 , 不代表刪除了代表部分事物的對象 ;
組合 是 contains-A 關系 ; ( 關系較強 ) 一旦刪除 代表組合事物的對象 ( 主 ) , 那么 代表部分事物的對象 ( 次 ) 也一起被刪除 ;
繼承 是 is-A 關系 ;
電腦 與 U 盤 是聚合關系 , 電腦沒了 , U 盤可以獨立存在 , 還可以接在其它電腦上 ;
A 類中包含了 B 類的引用 , 當 A 類對象銷毀時 , B 類引用所指向的對象也一同消失 , 沒有任何一個引用指向他 , 該引用成為了垃圾對象 , 被回收 ; 這種情況就是 組合 ;
加入 A 類銷毀后 , B 類對象還有在其它位置被引用 , B 類對象不會被銷毀 , 此時這種關系就是 聚合 ;
二、合成復用 與 繼承復用 優缺點
合成復用優點 : 使系統 更加靈活 , 降低 類與類 之間的耦合度 , 一個類的變化對其他類造成的影響相對較少 ;
合成復用缺點 : 通過 組合 / 聚合 方式建造的系統 , 有較多的對象需要管理 ;
繼承復用優點 : 擴展性容易實現 , 繼承父類后 , 父類的所有功能都可以通過繼承關系進入子類 , 修改和擴展都比較容易 ;
繼承復用缺點 : 破壞包裝 , 繼承將父類的實現細節暴露給了子類 , 這種復用稱為白箱復用 ;
繼承復用 稱為 白箱復用 , 組合 / 聚合 復用 稱為 黑箱復用 ;
黑箱復用 看不到 , 如 A 類中包含 B 類 , A 看不到 B 的具體實現細節 ;
三、合成復用原則代碼示例
1、繼承復用代碼示例
業務場景 : 向數據塊中添加數據 ; 先獲取數據庫連接 , 然后向數據庫中添加數據 ;
數據塊鏈接類 :
package compositionaggregation;/*** 數據塊連接*/ public class DBConnection {public String getConnection() {return "數據連接";} }增加數據類 :
package compositionaggregation;/*** 創造產品*/ public class ProductDao extends DBConnection {/*** 增加產品*/public void addProduct() {// 先獲取連接String conn = super.getConnection();System.out.println("使用 " + conn + " 增加產品");} }測試類 :
package compositionaggregation;public class Main {public static void main(String[] args) {ProductDao productDao = new ProductDao();productDao.addProduct();} }執行結果 :
2、合成復用代碼示例
數據庫連接抽象類 :
package compositionaggregation;/*** 數據塊連接*/ public abstract class DBConnection {public abstract String getConnection(); }Oracle 數據庫連接類 :
package compositionaggregation;/*** Oracle 數據塊連接*/ public class OracleConnection extends DBConnection {@Overridepublic String getConnection() {return "Oracle 數據庫連接";} }MySQL 數據庫連接類 :
package compositionaggregation;/*** MySQL 數據塊連接*/ public class MySqlConnection extends DBConnection {@Overridepublic String getConnection() {return "MySQL 數據庫連接";} }插入數據類 : 通過組合復用 , 注入數據庫連接類 ;
package compositionaggregation;/*** 創造產品*/ public class ProductDao {/*** 通過組合方式注入數據庫連接*/private DBConnection connection;public ProductDao(DBConnection connection) {this.connection = connection;}/*** 增加產品*/public void addProduct() {// 先獲取連接String conn = connection.getConnection();System.out.println("使用 " + conn + " 增加產品");} }測試類 :
package compositionaggregation;public class Main {public static void main(String[] args) {ProductDao productDao = new ProductDao(new OracleConnection());productDao.addProduct();} }執行結果 :
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【设计模式】软件设计七大原则 ( 合成复用原则 | 代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【设计模式】软件设计七大原则 ( 里氏替
- 下一篇: 【Flutter】Flutter 开发环