這里文章只做簡要描述,作為掃盲
在軟件開發過程中,遵循一定的設計原則可以幫助開發者創建更加靈活、可維護和可擴展的系統。設計模式的六大原則是面向對象設計的核心理念,本文將詳細介紹這些原則,并結合實例說明它們的重要性和應用方法。
文章目錄
- 單一職責原則(SRP, Single Responsibility Principle)
- ??開放封閉原則(OCP, Open/Closed Principle)
- 里氏替換原則(LSP,LisKov Substitution Principle)
- 接口隔離原則(ISP, Interface Segregation Principle)
- ??依賴倒置原則(DIP,Dependency Inversion Principle)
- ??合成復用原則(CARP,Composite/Aggregate Reuse Principle)
單一職責原則(SRP, Single Responsibility Principle)
定義:一個類應該只有一個引起變化的原因。即,一個類只負責一個職責。
意義:遵循單一職責原則,可以提高代碼的可讀性和可維護性,減少代碼的復雜度。
class ReportGenerator {
public:void generateReport() {// 生成報告}
};class ReportPrinter {
public:void printReport() {// 打印報告}
};
在這個示例中,ReportGenerator 負責生成報告,ReportPrinter 負責打印報告,遵循了單一職責原則。
??開放封閉原則(OCP, Open/Closed Principle)
定義:軟件實體應該對外擴展開放,對修改封閉。
意義:通過擴展而不是修改現有代碼來實現新的功能,可以提高系統的穩定性和可擴展性。
class Shape {
public:virtual void draw() = 0;
};class Circle : public Shape {
public:void draw() override {// 畫圓}
};class Rectangle : public Shape {
public:void draw() override {// 畫矩形}
};
在這個示例中,通過繼承 Shape 類來擴展新的形狀類,而不需要修改現有的 Shape 類。
里氏替換原則(LSP,LisKov Substitution Principle)
定義:子類應該能夠替換其基類,并且功能不受影響。
意義:確保繼承關系中的子類可以替代基類,保證系統的正確性。
class Bird {
public:virtual void fly() {// 飛行邏輯}
};class Sparrow : public Bird {
public:void fly() override {// 麻雀飛行邏輯}
};
在這個示例中,Sparrow 可以替代 Bird,且系統功能不受影響。
接口隔離原則(ISP, Interface Segregation Principle)
定義:使用多個專門的接口,而不是單一的總接口
意義:減少類之間的依賴,使系統更加靈活和易于維護。
class Printer {
public:virtual void print() = 0;
};class Scanner {
public:virtual void scan() = 0;
};class AllInOnePrinter : public Printer, public Scanner {
public:void print() override {// 打印邏輯}void scan() override {// 掃描邏輯}
};
在這個示例中,Printer 和 Scanner 接口分離,避免了單一接口的臃腫。
??依賴倒置原則(DIP,Dependency Inversion Principle)
定義:高層模塊不應該依賴低層模塊,二者都應該依賴抽象;抽象不應依賴細節,細節應該依賴抽象。
意義:通過依賴抽象層來解耦高層和低層模塊,提高系統的靈活性和可維護性。
class Database {
public:virtual void connect() = 0;
};class MySQLDatabase : public Database {
public:void connect() override {// MySQL 連接邏輯}
};class Application {
private:Database& db;
public:Application(Database& db) : db(db) {}void run() {db.connect();// 業務邏輯}
};
在這個示例中,Application 依賴于 Database 抽象接口,而不是具體實現,遵循了依賴倒置原則。
??合成復用原則(CARP,Composite/Aggregate Reuse Principle)
定義:優先使用對象組合而不是繼承來達到復用的目的。
意義:通過組合多個對象來實現新功能,而不是通過繼承,提高系統的靈活性和可復用性。
class Engine {
public:void start() {// 啟動引擎}
};class Car {
private:Engine engine;
public:void drive() {engine.start();// 駕駛邏輯}
};
在這個示例中,Car 通過組合 Engine 對象來實現驅動功能,而不是通過繼承。