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

缺点:

  • 增加系统复杂性:对于只有单一变化的系统,使用桥接模式可能会使设计变得过度抽象和复杂。
  • 需要正确识别两个独立的维度:对设计的抽象能力要求比较高,必须识别出系统中哪些维度是会独立变化的。
相关推荐
蜡笔小马1 小时前
07.C++设计模式-组合模式
c++·设计模式·组合模式
liulilittle1 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
每天回答3个问题1 小时前
leetcodeHot100 | 104.二叉树的最大深度
c++·面试·
坚果派·白晓明1 小时前
【鸿蒙PC三方库移植适配框架解读系列】第五篇:完整流程图与角色职责
c语言·c++·华为·harmonyos·鸿蒙
xiao_li_ya2 小时前
C++学习日记1(`*`的理解、const关键词)
开发语言·c++
郝学胜-神的一滴4 小时前
Qt 入门 01-02: 开发环境搭建指南
开发语言·c++·qt·客户端
Languorous.4 小时前
C++数据结构高阶|布隆过滤器(Bloom Filter)深度解析:从原理到手写实现,面试高频考点全覆盖
数据结构·c++·面试
山河木马4 小时前
Emscripten 从 C/C++ 调用 JavaScript
前端·javascript·c++
TANGLONG2224 小时前
【C++】继承详解——基类/派生类、作用域、默认函数、菱形继承(超详细)
java·c语言·c++·经验分享·笔记·ajax
小侯不躺平.5 小时前
C++ Boost库【2】 --stringalgo字符串算法
linux·c++·算法