每次需求評審產品總是讓我提高程式碼複用,說白了就是合成複用原則
前言
- 原則是對我們的一種約束,按照約束開發前期可能會很通過。但是程式能夠穩步的擴充套件及執行。面對程式開發時我們不能僅僅面對當下,還需考慮未來。
- 合成複用原則也叫做組合/聚合複用原則。相信在前面的原則系列中大家不止一次聽說過組合,聚合,依賴等關鍵詞了吧。他們之間都是一種耦合的作用。你可以能又要說了不是說高內聚低耦合的。但是你要記住一點不管怎麼低耦合。耦合還是會存在的。不耦合怎麼叫做協同開發了。你不與人交流如何讓別人知道你的想法呢?
- 顧名思義合成複用原則他是想讓我們能夠複用我們的邏輯程式碼。在依賴時儘量使用組合,聚合的方式來實現功能的整合,其次才是使用繼承的方式
造汽車
public class Common {
public static void main(String[] args) {
new WhileElectricCar().driver();
new RedElectricCar().driver();
new WhilePertolCar().driver();
new RedPertolCar().driver();
}
}
class Car{
public void driver() {
System.out.println("我是汽車,可以行駛");
}
}
class PertolCar extends Car {
@Override
public void driver() {
System.out.println("我是汽油汽車,正在行駛");
}
}
class WhilePertolCar extends PertolCar {
@Override
public void driver() {
System.out.println("我是白色的汽油汽車,正在行駛");
}
}
class RedPertolCar extends PertolCar {
@Override
public void driver() {
System.out.println("我是紅色的汽油汽車,正在行駛");
}
}
class ElectricCar extends Car {
@Override
public void driver() {
System.out.println("我是電力汽車,正在行駛");
}
}
class WhileElectricCar extends ElectricCar {
@Override
public void driver() {
System.out.println("我是白色的電力汽車,正在行駛");
}
}
class RedElectricCar extends ElectricCar {
@Override
public void driver() {
System.out.println("我是紅色的電力汽車,正在行駛");
}
}
- 上面程式碼像我們展示瞭如何製造汽車。可想而知當我們汽車種類和顏色種類越來越多的情況下,我們的子類也會越來越多。對應的UML圖示如下
- 按照這樣的發展,子類會越來越多不利於我們的管理,而且對我們的程式碼改動行也是非常大的。不夠靈活。假如我們除了顏色和車行駛能源角度還有是否自動這個引數,那麼我們所有的子類都得重新編寫。這無疑是不可取的,無疑也是程式碼不夠靈敏的。
合成複用
- 針對上面我們提到的問題,我們進行如下修改
public class Hecheng {
public static void main(String[] args) {
Color redColor = new Color() {
@Override
public String getCurrentColor() {
return "紅色";
}
};
Color whileColor = new Color() {
@Override
public String getCurrentColor() {
return "白色色";
}
};
Color blackColor = new Color() {
@Override
public String getCurrentColor() {
return "黑色";
}
};
PertolCar pertolCar1 = new PertolCar(redColor);
PertolCar pertolCar2 = new PertolCar(whileColor);
PertolCar pertolCar3 = new PertolCar(blackColor);
ElectricCar electricCar1 = new ElectricCar(redColor);
ElectricCar electricCar2 = new ElectricCar(whileColor);
ElectricCar electricCar3 = new ElectricCar(blackColor);
pertolCar1.driver();
pertolCar2.driver();
pertolCar3.driver();
electricCar1.driver();
electricCar2.driver();
electricCar3.driver();
}
}
interface Color{
public String getCurrentColor();
}
class Car{
private Color color;
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public Car(Color color) {
this.color = color;
}
public void driver() {
System.out.println(this.color.getCurrentColor()+"我是汽車,可以行駛");
}
}
class PertolCar extends Car {
public PertolCar(Color color) {
super(color);
}
@Override
public void driver() {
System.out.println(getColor().getCurrentColor()+"我是汽油汽車,正在行駛");
}
}
class ElectricCar extends Car {
public ElectricCar(Color color) {
super(color);
}
@Override
public void driver() {
System.out.println(getColor().getCurrentColor()+"我是電動汽車,正在行駛");
}
}
- 如果程式碼看到比較凌亂,我這裡整理了下對應的UML圖。應該看這比較清晰點。
小結
- 我們總是說面向介面程式設計。不管是介面也好,還是抽象也罷。我們的目的只有一個提高程式的複用性。複用性提高了自然就減少了同類的產生。也提高了我們對程式碼的維護性
設計原則總結
- 到這裡我們所有的設計原則已經全部梳理完了。【單一職責】【介面隔離原則】【依賴倒轉原則】【里氏替換原則】【開閉原則】【迪米特法則】【合成複用原則】七大設計原則
- 這些原則是我們在設計初期儘量遵循的。但是我們需要看清一個事實,我們沒必要也沒法完全的遵從這些設計原則。因為在實際的場景中除了程式碼的優雅我們還需要考慮成本。
以下總結取自於網路【語言中文網】
| 設計原則 | 一句話歸納 | 目的 | | --------- | ---------------------------------- | --------------------- | | 1⃣️單一職責原則 | 一個類只幹一件事,實現類要單一 | 便於理解,提高程式碼的可讀性(降低複雜度) | | 2⃣️介面隔離原則 | 一個介面只幹一件事,介面要精簡單一 | 功能解耦,高聚合、低耦合 | | 3⃣️依賴倒置原則 | 高層不應該依賴低層,要面向介面程式設計 | 更利於程式碼結構的升級擴充套件 | | 4⃣️里氏替換原則 | 不要破壞繼承體系,子類重寫方法功能發生改變,不應該影響父類方法的含義 | 防止繼承氾濫,子類必須遵從父類的設計 | | 5⃣️迪米特法則 | 不該知道的不要知道,一個類應該保持對其它物件最少的瞭解,降低耦合度 | 只和朋友交流,不和陌生人說話,減少程式碼臃腫 | | 6⃣️開閉原則 | 對擴充套件開放,對修改關閉 | 降低維護帶來的新風險 | | 7⃣️合成複用原則 | 儘量使用組合或者聚合關係實現程式碼複用,少使用繼承 | 降低程式碼耦合 |
- 學習設計模式最好的方式我覺得還是去看原始碼。工作這麼多年沒見過同事運用設計模式去開發的。唯一見到的就是在原始碼中
\
- 避免回表,引入索引下推|提高索引命中率 | 提前下班啦
- TDengine 時序性資料庫為什麼海量資料下不卡頓呢
- 神奇的XPath,快速完成前端及XML的元素定位,茫茫大海不迷路
- springboot通用分支處理---還在硬編碼特殊處理邏輯?超級管理員不應該被區別對待
- Spring事務太強大了,相容資料庫同時給我們提供多種組合應對業務需求
- java物件在記憶體中如何分佈 | java上鎖原來就是記憶體佔位,so easy
- linux三劍客之編輯器sed出廠
- linux三劍客awk教你如何裁剪結果集
- 執行緒池7個引數拿捏死死的,完爆面試官
- 執行緒池存在的意義
- 多年程式設計師總結下來的懶人必備指令碼之進度條⚠️製作
- java中的static關鍵字說清楚還得靠JVM
- 設計模式存在哪些關聯關係,六種關係傻傻分不清--- UML圖示詳解
- 每次需求評審產品總是讓我提高程式碼複用,說白了就是合成複用原則
- 越級上報不可行,各司其職才是王道---迪米特法則
- 偏向鎖/輕量鎖/重級鎖鎖鎖更健康,上鎖解鎖到底是怎麼完成實現的,我來告訴你
- 狸貓換太子里氏替換原則;不要一味的進行抽象否則最後你無法hold你的物件
- 設計模式是我擺脫碼畜的唯一出路---依賴倒轉原則
- 學好數理化,寫遍所有程式碼都不怕,我用數學分類討論的思想解決
- synchronized已經不在臃腫了,放下對他的成見之初識輕量級鎖