1. 程式人生 > 其它 >00_7面向物件設計原則-合成複用原則

00_7面向物件設計原則-合成複用原則

定義:指儘量使用物件組合或物件聚合的方式實現程式碼複用,而不是用繼承關係達到複用程式碼的目的。合成複用原則可以使系統更加靈活,降低類與類之間的耦合度,一個類的變化對其他類造成的影響相對較小。 繼承,又被稱為白箱複用,相當於把所有實現細節暴露給子類。組合/聚合又被稱為黑箱複用。對類以外的物件是無法獲取到實現細節的。我們要根據具體的業務場景來做程式碼設計。 來我們看一個案例,還是以資料庫操作為例,首先建立DBConnection類:
package org.test.design.principle.carp;

public class DBConnection {
    public String getConnection(){
        return "MySQL資料庫連線";
    }
}
建立ProductDao類:
package org.test.design.principle.carp;

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,程式碼如下:
package
org.test.design.principle.carp; public abstract class DBConnectionV2 { public abstract String getConnection(); }
然後將MySQL的邏輯抽離
package org.test.design.principle.carp;

public class MySQLConnection extends DBConnectionV2{
    @Override
    public String getConnection() {
        return "MySQL資料庫連線";
    }
}
再建立Oracle支援的邏輯
package org.test.design.principle.carp;

public class OracleConnection extends DBConnectionV2{
    @Override
    public String getConnection() {
        return "Oracle資料庫連線";
    }
}

此篇完。