橋接模式是結構型設計模式之一,核心思想是「將抽象部分與實現部分分離,使它們可以獨立變化」。本文通過求解器案例,講解橋接模式如何替代繁雜的繼承體系,並分析 auto_ptr 的使用細節與缺陷。
假設有兩種求解算法 A、B,兩種取值方法 a、b。若用繼承組合,需建立 A_a、A_b、B_a、B_b 四個類。新增算法或取值方式將導致類數量呈乘法增長。
定義兩個獨立層級:
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 */ } };
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 構造邏輯,符合開閉原則。
new int[10])auto_ptr<int> p = new int(42); 編譯錯誤,構造函數 explicit)現代替代:std::unique_ptr(獨佔)、std::shared_ptr(共享)、std::weak_ptr(弱引用)。
橋接模式通過組合替代繼承,將「抽象」與「實現」解耦,極大提升擴展性。結合智能指針管理資源,是 C++ 設計大型系統的利器。請拋棄 auto_ptr,擁抱現代智能指針。