设计模式(C++)-结构型模式-桥接模式

设计模式(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接口,不关心具体实现,降低了耦合度。

缺点:

  • 增加系统复杂性:对于只有单一变化的系统,使用桥接模式可能会使设计变得过度抽象和复杂。
  • 需要正确识别两个独立的维度:对设计的抽象能力要求比较高,必须识别出系统中哪些维度是会独立变化的。
相关推荐
亦暖筑序15 小时前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户8055336980318 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK1 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境2 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴3 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
青禾网络3 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
ZJPRENO4 天前
吃透软件开发六大设计原则,告别烂代码
设计模式
咖啡八杯4 天前
GoF设计模式——命令模式
java·设计模式·架构
花椒技术4 天前
HJPusher / HJPlayer SDK 实践:我们为什么把直播推播链路拆成一套可复用能力
设计模式·harmonyos·直播