概述
簡單介紹一下七大設計原則:
- 開閉原則:是所有面向物件設計的核心,對擴展開放,對修改關閉
- 依賴倒置原則:針對介面編程,依賴于抽象而不依賴于具體
- 單一職責原則:一個介面只負責一件事情,只能有一個原因導致類變化
- 介面隔離原則:使用多個專門的介面,而不是使用一個總介面
- 迪米特法則(最少知道原則):只和朋友交流(成員變數、方法輸入輸出引數),不和陌生人說話,控制好訪問修飾符
- 里氏替換原則:子類可以擴展父類的功能,但不能改變父類原有的功能
- 合成復用原則:盡量使用物件組合(has-a)/聚合(contanis-a),而不是繼承關系達到軟體復用的目的
合成復用原則
定義
合成復用原則(Composite/Aggregate Reuse Principle,CARP)是指盡量使用物件組 合(has-a)/聚合(contanis-a),而不是繼承關系達到軟體復用的目的,可以使系統更加靈 活,降低類與類之間的耦合度,一個類的變化對其他類造成的影響相對較少,
繼承我們叫做白箱復用,相當于把所有的實作細節暴露給子類,組合/聚合也稱之為黑箱 復用,對類以外的物件是無法獲取到實作細節的,要根據具體的業務場景來做代碼設計, 其實也都需要遵循 OOP 模型,
示例
還是以資料庫操作為例,先來創建 DBConnection 類:
/**
* @author eamon.zhang
* @date 2019-09-26 上午10:42
*/
public class DBConnection {
public String getConnection() {
return "MySQL 資料庫連接";
}
}
創建 ProductDao 類:
/**
* @author eamon.zhang
* @date 2019-09-26 上午10:43
*/
public class ProductDao {
private DBConnection dbConnection;
public void setDbConnection(DBConnection dbConnection) {
this.dbConnection = dbConnection;
}
public void addProduct() {
String conn = dbConnection.getConnection();
System.out.println("使用" + conn + "增加產品");
}
}
這就是一種非常典型的合成復用原則應用場景,但是,目前的設計來說,DBConnection 還不是一種抽象,不便于系統擴展,目前的系統支持 MySQL 資料庫連接,假設業務發生 變化,資料庫操作層要支持 Oracle 資料庫,當然,我們可以在 DBConnection 中增加對 Oracle 資料庫支持的方法,但是違背了開閉原則,其實,我們可以不必修改 Dao 的代碼, 將 DBConnection 修改為 abstract,來看代碼:
/**
* @author eamon.zhang
* @date 2019-09-26 上午10:42
*/
public abstract class DBConnection {
public abstract String getConnection();
}
然后,將 MySQL 的邏輯抽離:
/**
* @author eamon.zhang
* @date 2019-09-26 上午10:46
*/
public class MySQLConnection extends DBConnection {
@Override
public String getConnection() {
return "MySQL 資料庫連接";
}
}
再創建 Oracle 支持的邏輯:
/**
* @author eamon.zhang
* @date 2019-09-26 上午10:47
*/
public class OracleConnection extends DBConnection {
@Override
public String getConnection() {
return "Oracle 資料庫連接";
}
}
具體選擇交給應用層,來看一下類圖:

設計原則總結
學習設計原則,學習設計模式的基礎,在實際開發程序中,并不是一定要求所有代碼都 遵循設計原則,我們要考慮人力、時間、成本、質量,不是刻意追求完美,要在適當的 場景遵循設計原則,體現的是一種平衡取舍,幫助我們設計出更加優雅的代碼結構,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/44362.html
標籤:設計模式
上一篇:設計模式 - 七大設計原則(三)- 迪米特法則與里氏替換原則
下一篇:通俗易懂設計模式決議——命令模式
