欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > C++设计模式----桥接模式

C++设计模式----桥接模式

2025/11/12 14:57:20 来源:https://blog.csdn.net/qq_34486832/article/details/139649367  浏览:    关键词:C++设计模式----桥接模式

1、介绍

        桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系,将系统划分成多个独立的、功能不同的类层次结构,并通过桥接类将它们连接起来。
        在桥接模式中,有两个重要的概念:抽象化(Abstraction)和实现化(Implementation),它们分别对应了系统的抽象部分和实现部分。抽象化负责定义接口,并维护一个指向实现化对象的指针;实现化则负责定义具体的实现方法

桥接模式详解:
(1)角色定义:

        Abstraction(抽象化角色):定义抽象接口,维护一个对Implementor对象的引用。
        RefinedAbstraction(具体抽象化角色):是Abstraction的一个子类,对Abstraction接口进行一些补充。
        Implementor(实现化角色):定义实现化角色的接口,任何Abstraction角色可以调用。
        ConcreteImplementor(具体实现化角色):Implementor接口的具体实现。
(2)工作原理

        抽象化角色持有实现化角色的引用,它只需要定义与客户端的接口并委托给实现化角色来执行。
        具体化角色继承抽象化角色并实现自己的业务逻辑,同时构造时关联相应的实现化角色。

应用场景:

(1)图形界面库

        图形界面库通常提供一组通用的界面元素(如按钮、文本框、下拉菜单等),同时也提供多种不同的绘制方式(如窗口系统的绘制、OpenGL的绘制等)。桥接模式可以将界面元素和绘制方式解耦,使得它们可以独立地变化。

        例如,可以定义一个抽象类“UIElement”,它包含一个指向“Graphics”类的指针。通过调用“Graphics”类的绘制方法,可以绘制不同的界面元素,而不影响界面元素本身的定义。

(2)操作系统文件系统

        文件系统需要支持多种存储介质(如磁盘、光盘、网络存储等)和多种文件系统类型(如FAT32、NTFS、EXT4等)。桥接模式可以将存储介质和文件系统类型解耦,使得它们可以独立地变化。

        在Windows操作系统中,可以定义一个抽象类“File”,它包含一个指向“Storage”类和“FileSystem”类的指针。通过调用“Storage”类的读写方法和“FileSystem”类的文件操作方法,可以完成文件的读写和操作。

(3)游戏开发中的人物角色

        在游戏开发中,人物角色通常具有多种不同的属性和技能(如力量、敏捷、法力等),同时人物角色还可以使用多种不同的武器和装备(如剑、弓、盾等)。桥接模式可以将属性和技能解耦,使得它们可以独立地变化。

        例如,可以定义一个抽象类“Character”,它包含一个指向“Attribute”类和“Skill”类的指针。通过调用“Attribute”类的方法和“Skill”类的方法,可以处理人物角色的属性和技能。

(4)网络通信框架

        在网络通信框架中,抽象接口可以定义诸如发送消息、接收消息等功能,而具体实现可以包括TCP、UDP、WebSocket等多种协议。桥接模式允许上层应用只关注消息的发送和接收逻辑,而无需关心底层通信协议的具体实现。

(5)多语言本地化

        在国际化应用中,桥接模式可以将界面的逻辑(如按钮、标签、提示信息等)与具体语言环境(如英文、中文、法文等)分离。通过桥接模式,可以在切换不同语言环境时,仅替换具体的本地化实现,而无需修改界面的逻辑部分。

2、示例

#include <iostream>/**************************************************************************************/
// 实现化接口
class RoleImpl {  
public:  virtual ~RoleImpl() = default;  virtual void attack() = 0;  // 攻击行为  virtual void defend() = 0;  // 防御行为  // ... 其他与内部实现相关的操作  
};// 具体实现化---战士
class WarriorImpl : public RoleImpl {  
public:  void attack() override {  std::cout << "Warrior attacks with sword!" << std::endl;  }  void defend() override {  std::cout << "Warrior blocks with shield!" << std::endl;  }  // ... 其他方法  
};
/**************************************************************************************//**************************************************************************************/
// 抽象化游戏角色
class Role {  
protected:RoleImpl* impl_;              // 内部实现的指针【包含一个实现化接口类对象指针】
public:  // 构造函数Role(RoleImpl* impl) : impl_(impl) {}// 析构函数virtual ~Role(){delete impl_;}virtual void display() = 0;   // 显示角色外观  virtual void fight() = 0;     // 角色战斗,通过内部实现执行  // ... 其他与外观相关的操作  
};// 具体化游戏角色---战士
class WarriorRole : public Role {  
public:  WarriorRole(RoleImpl* impl) : Role(impl) {}  void display() override {  std::cout << "Warrior is ready for battle!" << std::endl;  // ... 其他与战士外观相关的操作  }  void fight() override {  impl_->attack(); // 调用内部实现的攻击方法  // ... 其他与战士战斗相关的操作  }  // ... 其他方法  
};  
/**************************************************************************************/int main() {  RoleImpl* warriorImpl = new WarriorImpl();         // 创建战士的内部实现  Role* warriorRole = new WarriorRole(warriorImpl);  // 创建战士的外观,并关联内部实现  warriorRole->display();    // 显示战士的外观  warriorRole->fight();      // 战士战斗,执行内部实现的攻击方法  // ... 类似地创建和组合法师、弓箭手等角色  delete warriorRole;  return 0;  
}

结果:

Warrior is ready for battle!
Warrior attacks with sword!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词