一、原則概述
合成復用原則(Composition/Aggregation Reuse Principle)是指使用組合或聚合關係來代替繼承,達到復用的目的,它要求盡量使用合成/聚合關係,盡量不要使用繼承。該原則能夠避免繼承所帶來的一些問題,如繼承某個類的所有屬性和方法可能不符合實際需求,子類過多地依賴父類,導致系統的維護和擴展困難等。而使用合成/聚合關係則能夠避免這些問題的出現,使得系統更加的靈活。
二、優點
使用合成復用的優點可以從以下兩個方面進行分析:
1. 提高系統靈活性
使用合成/聚合關係能夠提高系統的靈活性,使得系統的結構更加穩定,更容易進行擴展和維護,也能夠使得系統更加的易於理解和可讀性更好。
2. 降低類之間的耦合度
使用繼承會導致子類和父類之間的耦合度很高,因為子類繼承了父類的屬性和方法,在使用時不能很好的進行定製化,只能進行較小的修改。而使用合成/聚合關係則能夠使得類之間的耦合度降低,使得類之間更加獨立,更容易維護。
三、代碼示例
下面是一個基於合成復用原則設計的代碼實例:
class Engine { public: virtual void run() = 0; }; class GasolineEngine : public Engine { public: void run() override { // run by gasoline } }; class ElectricEngine : public Engine { public: void run() override { // run by electricity } }; class Vehicle { public: Vehicle(Engine *engine) : engine(engine) {} void run() { engine->run(); } private: Engine *engine; }; class Car : public Vehicle { public: Car(Engine *engine) : Vehicle(engine) {} }; class Bus : public Vehicle { public: Bus(Engine *engine) : Vehicle(engine) {} };
上面的代碼中,Engine類是引擎類的抽象基類,定義了run方法,而GasolineEngine和ElectricEngine是引擎類的實現類,具體實現了run方法。Vehicle類為車輛類,引入了Engine指針,用於表示車輛所搭載的引擎。而Car和Bus是車輛類的具體實現,通過繼承Vehicle類來實現,同時指定所搭載的引擎。
四、使用注意點
使用合成復用原則需要注意以下幾點:
1.抽象基類需要合理設計
抽象基類是合成復用中的重要組成部分,需要設計合理的接口和抽象方法,保證具體實現類可以全部實現,並且不需要進行修改。在使用抽象基類時,需要特別注意接口和抽象方法的設計。
2.合理使用聚合和組合關係
在使用合成復用時,需要合理使用聚合和組合關係。聚合是指一個對象可以包含另一個對象,但並不擁有該對象,如上面的Vehicle類包含了Engine對象。組合是指一個對象包含另一個對象,並擁有該對象,如黑色棋子遊戲中的棋盤和棋子的關係。在使用時需要按照需求進行選擇,避免不必要的耦合。
3.考慮接口的重用性
在使用合成復用原則時,需要考慮接口的重用性。有時候可以抽象出復用的接口,使得不同的類型都能夠使用同一個接口,從而提高系統的靈活性和擴展性。
原創文章,作者:AWULZ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/369221.html