合成复用原则java实例_第7节 合成复用原则
## 一、定義
合成/聚合復(fù)用原則是**在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使之成為新對(duì)象的一部分;新的對(duì)象通過(guò)向這些對(duì)象的委派達(dá)到復(fù)用已有功能的目的**。
簡(jiǎn)述為:**要盡量使用合成/聚合,盡量不要使用繼承**。
## 二、具體說(shuō)明
>繼承我們叫做白箱復(fù)用,相當(dāng)于把所有的實(shí)現(xiàn)細(xì)節(jié)暴露給子類。組合/聚合稱為黑箱復(fù)用,我們是無(wú)法獲取到類以外的對(duì)象的實(shí)現(xiàn)細(xì)節(jié)的。雖然我們要根據(jù)具體的業(yè)務(wù)場(chǎng)景來(lái)做代碼設(shè)計(jì),但也需要遵循 OOP 模型。以數(shù)據(jù)庫(kù)操作為例,先來(lái)創(chuàng)建 DBConnection 類:
~~~
public class DBConnection {
public String getConnection() {
return "MySQL 數(shù)據(jù)庫(kù)連接";
}
}
~~~
創(chuàng)建 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 + "增加產(chǎn)品");
}
}
~~~
這就是一種非常典型的合成復(fù)用原則的應(yīng)用場(chǎng)景。但是,就目前的設(shè)計(jì)來(lái)說(shuō),DBConnection 還不是一種抽象,不便于系統(tǒng)擴(kuò)展。目前的系統(tǒng)支持 MySQL 數(shù)據(jù)庫(kù)連接,假設(shè)業(yè)務(wù)發(fā)生變化,數(shù)據(jù)庫(kù)操作層要支持 Oracle 數(shù)據(jù)庫(kù)。當(dāng)然,我們可以在 DBConnection 中增加對(duì) Oracle 數(shù)據(jù)庫(kù)支持的方法。但是這違背了開(kāi)閉原則。其實(shí),我們可以不必修改 Dao 的代碼,將 DBConnection 修改為 abstract,來(lái)看代碼:
~~~
public abstract class DBConnection {
public abstract String getConnection();
}
~~~
然后,將 MySQL 的邏輯抽離:
~~~
public class MySQLConnection extends DBConnection {
@Override
public String getConnection() {
return "MySQL 數(shù)據(jù)庫(kù)連接";
}
}
~~~
再創(chuàng)建 Oracle 支持的邏輯:
~~~
public class OracleConnection extends DBConnection {
@Override
public String getConnection() {
return "Oracle 數(shù)據(jù)庫(kù)連接";
}
}
~~~
具體選擇交給應(yīng)用層,來(lái)看一下類圖:

總結(jié)
以上是生活随笔為你收集整理的合成复用原则java实例_第7节 合成复用原则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 动态性是Java的特性吗_Java的动态
- 下一篇: java dart 官司_Dart和Ja