设计模式(C++)-结构型模式-桥接模式
一、桥接模式概述
桥接模式是一种结构型设计模式,其核心思想是将抽象部分与它的实现部分分离,使得它们都可以独立地变化。
这里的"抽象"和"实现"有特定含义:
- 抽象:并不是指"抽象类",而是指业务逻辑的高层次控制部分。它持有实现部分的引用,并通过这个引用将工作委派给它。
- 实现:并不是指"具体的实现类",而是指底层的基础逻辑、平台相关代码或通用接口。
简单来说,桥接模式是用组合代替继承,将一个大类或多个紧密相关的类拆分成抽象层次和实现层次两个独立的继承体系,然后由抽象层持有实现层的接口引用,从而将它们"桥接"起来。
一个生动的比喻:遥控器(抽象)和电器(实现)
二、桥接模式UML类图
2.1 场景:APP运行在不同类型手机上
模拟微信、王者荣耀等app可以在iPhone、华为、Android不同类型手机上允许。

三、代码实现
cpp
//bridge.h
#pragma once
/*
桥接模式(Bridge Pattern)是一种结构型设计模式,
它将抽象部分与实现部分分离,使它们可以独立地变化。
这种模式通过将一个类的抽象部分与它的实现部分分开,
允许它们可以独立扩展和变化,同时也提供了一种组合的方式来连接抽象部分和实现部分。
在 C++ 中,可以使用类来实现桥接模式。以下是一个简单的示例代码,
演示了如何使用桥接模式来实现不同类型的手机和不同的应用程序:
*/
#include <iostream>
#include <memory>
using namespace std;
//实现层:手机
class Phone {
public:
virtual void runApp() = 0;
};
//抽象层:应用程序
class App {
public:
virtual void runOnPhone(Phone*phone) = 0;
};
//具体手机类:华为手机
class HuaWeiPhone :public Phone {
public:
virtual void runApp()override;
};
//具体手机类:苹果手机
class IPhone :public Phone {
public:
virtual void runApp()override;
};
//具体的应用程序:微信
class WeChat :public App {
public:
virtual void runOnPhone(Phone*phone)override;
};
//具体的应用程序:王者荣耀
class WangZheRongYao :public App {
public:
virtual void runOnPhone(Phone*phone)override;
};
void testBridge();
//bridge.cpp
#include "bridge.h"
void HuaWeiPhone::runApp() {
cout << "华为手机运行应用程序" << endl;
}
void IPhone::runApp() {
cout << "苹果手机运行应用程序" << endl;
}
void WeChat::runOnPhone(Phone*phone) {
cout << "微信在" << typeid(*phone).name() << " 上运行" << endl;
}
void WangZheRongYao::runOnPhone(Phone*phone) {
cout << "王者荣耀在" << typeid(*phone).name() << " 上运行" << endl;
}
void testBridge() {
cout << "=================Bridge begin===============" << endl;
//创建华为手机对象
std::shared_ptr<Phone> huawei = std::make_shared<HuaWeiPhone>();
//创建微信应用程序对象
std::shared_ptr<WeChat> wechat = std::make_shared<WeChat>();
//在华为手机上运行微信
wechat->runOnPhone(huawei.get());
//创建苹果手机对象
std::shared_ptr<Phone> iphone = std::make_shared<IPhone>();
//创建王者荣耀对象
std::shared_ptr<WangZheRongYao> wzry = std::make_shared<WangZheRongYao>();
//在苹果手机上运行王者荣耀
wzry->runOnPhone(iphone.get());
cout << "=================Bridge End===============" << endl;
}
四、优缺点总结
优点:
- 分离抽象与实现:将不稳定的实现细节隐藏起来,让高层架构更清晰、更稳定
- 开闭原则:抽象层和实现层可以独立扩展,新增抽象或实现不会影响对方。
- 组合优于继承:避免多层继承带来的复杂性,用组合关系更灵活
- 客户端仅与高层抽象交互:客户端代码只依赖APP和Phone接口,不关心具体实现,降低了耦合度。
缺点:
- 增加系统复杂性:对于只有单一变化的系统,使用桥接模式可能会使设计变得过度抽象和复杂。
- 需要正确识别两个独立的维度:对设计的抽象能力要求比较高,必须识别出系统中哪些维度是会独立变化的。