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

缺点:

  • 增加系统复杂性:对于只有单一变化的系统,使用桥接模式可能会使设计变得过度抽象和复杂。
  • 需要正确识别两个独立的维度:对设计的抽象能力要求比较高,必须识别出系统中哪些维度是会独立变化的。
相关推荐
楼田莉子2 小时前
仿muduo库的高并发服务器——正则表达式与any类介绍及其简单模拟实现
linux·服务器·c++·学习·设计模式
workflower2 小时前
机器人应用-室外区域巡逻
人工智能·设计模式·机器人·软件工程·软件构建
wengqidaifeng3 小时前
C++从菜鸟到强手:1.基础入门
开发语言·c++
geovindu4 小时前
go: Flyweight Pattern
开发语言·设计模式·golang·享元模式
handler0111 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
t***54412 小时前
如何在Dev-C++中使用Clang编译器
开发语言·c++
Qbw200412 小时前
【Linux】进程地址空间
linux·c++
6Hzlia13 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香13 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法