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