C++ 桥接模式(Bridge)

桥接模式详解
本文深入解析桥接模式,一种设计模式,用于解决多个维度变化的问题,通过将抽象与其实现分离,达到各自独立变化的目的。文章通过代码示例展示了如何在手机应用与软件开发中运用桥接模式,实现不同手机品牌与软件间的灵活组合。

简介

桥接模式(Bridge):将抽象部分与它的实现部分分离,使他们都能够独立地变化。

作用

解决在有多种可能会变化的情况下,用继承会造成类越来越复杂问题,扩展起来不灵活。

应用场景

设计中有超过一维的变化我们就可以用桥模式。如果只有一维在变化,那么我们用继承就可以圆满的解决问题。

代码如下:

#include <iostream>
#include <string>
#include <memory>

///////////////////////////////////////
//软件基类
class software
{
public:
    software(void){}
    virtual ~software(void){}

public:
    virtual void opt(void) = 0;
};
//手机基类
class mobilephone
{
public:
    mobilephone(void){}
    virtual ~mobilephone(void){}

public:
    virtual void opt() = 0;
};
class mobilephone_sw
{
public:
    mobilephone_sw(std::shared_ptr<software> sw)
		: m_software(sw)
	{
			
	}
    virtual ~mobilephone_sw(void){}

public:
    virtual void opt() = 0;
	std::shared_ptr<software> m_software;
};
///////////////////////////////////////
//苹果手机
class iphone : public mobilephone_sw
{
public:
    iphone(std::shared_ptr<software> sw) : mobilephone_sw(sw){}
    virtual ~iphone(void){}

public:
    void opt(void)
	{
		std::cout << "opt : this is iphone" << std::endl;
		m_software->opt();
	}
};
//华为手机
class huawei : public mobilephone_sw
{
public:
    huawei(std::shared_ptr<software> sw): mobilephone_sw(sw){}
    virtual ~huawei(void){}

public:
    void opt(void)
	{
		std::cout << "opt : this is huawei" << std::endl;
		m_software->opt();
	}

};
///////////////////////////////////////
//软件 :王者荣耀
class wangzhe : public software
{
public:
    wangzhe(void){}
    virtual ~wangzhe(void){}

public:
    virtual void opt(void)
	{
		std::cout << "opt : 王者荣耀 !" << std::endl;
	}
};
//软件 : 淘宝
class taobao : public software
{
public:
    taobao(void){}
    virtual ~taobao(void){}

public:
    virtual void opt(void)
	{
		std::cout << "opt : 淘宝 !" << std::endl;
	}
};
///////////////////////////////////////
int main()
{
	std::cout << "start-up .." << std::endl;
	std::shared_ptr<wangzhe> p_wz = std::make_shared<wangzhe>();
	std::shared_ptr<taobao>  p_tb = std::make_shared<taobao>();
	
	std::shared_ptr<iphone> p_ip = std::make_shared<iphone>(p_wz);
	std::shared_ptr<huawei> p_hw = std::make_shared<huawei>(p_tb);
	
    p_ip->opt();
    p_hw->opt();
	
	std::cout << "done .." << std::endl;
    return 0;
}

运行结果:
在这里插入图片描述

<think>好的,用户想了解C++桥接模式的实现和用法。我之前已经回答过相关问题,现在需要根据提供的引用内容来整理一个清晰的回答。首先,桥接模式的核心是分离抽象和实现,允许它们独立变化。引用中的内容提到了抽象类接口、实现类接口以及具体实现类的结构,我需要把这些部分组织起来。 用户可能需要一个具体的例子来理解。引用5中的代码示例展示了手机品牌和软件的关系,这可能是一个不错的例子。我需要解释各个角色,比如抽象类HandSetBrand和实现类HandSetSoft,以及它们如何解耦。同时,要说明桥接模式如何避免类的爆炸性增长,这点在引用4中提到过。 还要注意代码的结构,比如抽象类持有实现类的指针,通过组合而不是继承来连接两者。这样在扩展时,新增品牌或软件都不影响对方,符合开闭原则。需要详细说明示例中的每个类的作用,比如ConcreteImplementorA和B如何实现接口,RefinedAbstraction如何扩展抽象。 另外,用户可能想知道桥接模式的应用场景,引用3和4提到图形和绘制方式的分离,以及多维度变化的情况。这部分需要结合实际例子说明,比如不同的UI主题和业务逻辑的组合。 最后,生成相关问题时要考虑用户可能想深入的内容,比如与其他模式的区别、实际项目中的应用案例、优缺点分析等。确保问题覆盖用户可能感兴趣的扩展方向。</think>以下是对C++桥接模式的实现与用法的详细说明: ### C++桥接模式实现与示例 桥接模式通过**分离抽象与实现**,使两者可独立扩展。其核心是**用组合代替继承**,避免多维变化导致的类爆炸[^3][^4]。 #### 模式结构 | 角色 | 作用 | 示例代码中的对应类 | |---------------------|------------------------------------------------------------|---------------------------| | 抽象类接口(Abstraction) | 定义高层控制逻辑,包含实现类接口的指针 | `HandSetBrand` | | 扩展抽象类(Refined) | 扩展抽象接口,增加具体控制逻辑 | `HandSetBrandN`/`HandSetBrandM` | | 实现类接口(Implementor)| 定义底层操作的接口 | `HandSetSoft` | | 具体实现类(Concrete) | 实现具体业务功能 | `HandSetGame`/`HandSetAddressList` | #### 代码实现示例 ```cpp // 实现类接口 class HandSetSoft { public: virtual void run() = 0; virtual ~HandSetSoft() {} }; // 具体实现类 class HandSetGame : public HandSetSoft { public: explicit HandSetGame(const string& name) : m_name(name) {} void run() override { cout << "运行游戏:" << m_name << endl; } private: string m_name; }; // 抽象类接口 class HandSetBrand { public: virtual void addHandSetSoft(HandSetSoft* soft) { m_softs.push_back(soft); } virtual void run() { for (auto& soft : m_softs) { soft->run(); } } virtual ~HandSetBrand() { for (auto& soft : m_softs) { delete soft; } } protected: vector<HandSetSoft*> m_softs; }; // 扩展抽象类 class HandSetBrandN : public HandSetBrand { public: void run() override { cout << "===N品牌手机===" << endl; HandSetBrand::run(); } }; ``` #### 使用场景 1. 需要**多维度扩展**时(如手机品牌×软件类型)[^5] 2. **避免继承层次过深**导致类爆炸 3. **运行时绑定**不同实现(如动态切换数据库驱动) 4. **平台无关性**需求(如跨平台图形渲染)[^3] #### 优势对比 | 场景 | 传统继承方案 | 桥接模式方案 | |-------------------|--------------------------------|----------------------------| | 新增手机品牌 | 需为每个品牌创建所有软件组合类 | 只需添加新品牌类 | | 增加新软件类型 | 需修改所有品牌类 | 只需添加新软件类 | | 组合变化 | M×N个类 | M+N个类 | [^1]: 桥接模式通过分离抽象与实现,提高了系统的扩展性 [^3]: 图形与绘制方式的分离是经典应用场景 [^4]: 组合方式替代继承是核心优势
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值