軟件架構設計原則之合成復用原則


合成復用原則(Composite/Aggregate Reuse Principle,CARP)是指盡量使用對象組合(has-a)/聚合(contanis-a)而不是繼承關系達到軟件復用的目的。可以使系統更加靈活,降低類與類之間的耦合度,一個類的變化對其他類造成的影響相對較少。

繼承叫作白箱復用,相當於把所有的實現細節暴露給子類。組合/聚合稱為黑箱復用,我們是無法獲取到類以外的對象的實現細節的。雖然我們要根據具體的業務場景來做代碼設計,但也需要遵循OOP模型。以數據庫操作為例,先來創建DBConnection類:

public class DBConnection {

    public String getConnection(){

        return "MySQL數據庫連接";

    }

}

創建ProductDao類:

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”的,來看代碼:

public abstract class DBConnection {

    public abstract String getConnection();

}

然后將MySQL的邏輯抽離:

public class MySQLConnection extends DBConnection {

    @Override

    public String getConnection() {

        return "MySQL數據庫連接";

    }

}

再創建Oracle支持:

public class OracleConnection extends DBConnection {

    @Override

    public String getConnection() {

        return "Oracle數據庫連接";

    }

}

具體選擇交給應用層,來看一下類圖,如下圖所示。

關注微信公眾號『 Tom彈架構 』回復“設計模式”可獲取完整源碼。

【推薦】Tom彈架構:30個設計模式真實案例(附源碼),挑戰年薪60W不是夢

本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!

其他設計原則

Tom彈架構:開閉原則(Open-Closed Principle,OCP)

Tom彈架構:依賴倒置原則(Dependence Inversion Principle,DIP)

Tom彈架構:單一職責原則(Simple Responsibility Pinciple,SRP)

Tom彈架構:接口隔離原則(Interface Segregation Principle, ISP)

Tom彈架構:迪米特原則(Law of Demeter LoD)

Tom彈架構:里氏替換原則(Liskov Substitution Principle,LSP)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM