首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 橋接模式詳解:解耦抽象與實現的經典實戰

     編輯:關於C語言

橋接模式是結構型設計模式之一,核心思想是「將抽象部分與實現部分分離,使它們可以獨立變化」。本文通過求解器案例,講解橋接模式如何替代繁雜的繼承體系,並分析 auto_ptr 的使用細節與缺陷。

1. 問題背景:多維度變化導致類爆炸

假設有兩種求解算法 A、B,兩種取值方法 a、b。若用繼承組合,需建立 A_a、A_b、B_a、B_b 四個類。新增算法或取值方式將導致類數量呈乘法增長。

2. 橋接模式重構

定義兩個獨立層級:

  • 抽象層:Base 定義求解接口,持有實現指針
  • 實現層:Model 定義取值接口,具體類 A、B 實現求解,a、b 實現取值
class Model { // 實現接口
public:
    virtual void yizhi() = 0;
    virtual ~Model() = default;
};

class Base { // 抽象接口
protected:
    std::auto_ptr<Model> ptr; // 智能指針管理實現對象
public:
    virtual void qiujie() = 0;
    virtual ~Base() = default;
};

class A : public Base { // 具體抽象
public:
    void qiujie() override { ptr->yizhi(); }
};

class B : public Base {
public:
    B() {}
    void qiujie() override { ptr->yizhi(); }
};

class a : public Model { void yizhi() override { /* 實現a */ } };
class b : public Model { void yizhi() override { /* 實現b */ } };

3. 管理類動態組合

class Manager {
    std::auto_ptr<Base> ptr;
public:
    Manager(int type) {
        if (type == 1) ptr.reset(new A());
        else ptr.reset(new B());
    }
    void run() { ptr->qiujie(); }
};

新增算法 C、D 只需增加類並修改 Manager 構造邏輯,符合開閉原則。

4. auto_ptr 使用陷阱(C++11 已棄用,C++17 移除)

  • ❌ 不能管理數組(new int[10])
  • ❌ 不能放入 STL 容器(複製語義導致所有權轉移)
  • ❌ 不支持拷貝構造/賦值(auto_ptr<int> p = new int(42); 編譯錯誤,構造函數 explicit)
  • ✅ 僅適用於單一對象獨佔所有權場景

現代替代:std::unique_ptr(獨佔)、std::shared_ptr(共享)、std::weak_ptr(弱引用)。

總結

橋接模式通過組合替代繼承,將「抽象」與「實現」解耦,極大提升擴展性。結合智能指針管理資源,是 C++ 設計大型系統的利器。請拋棄 auto_ptr,擁抱現代智能指針。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved