当前位置: 首页 > news >正文

使用“桥接模式“,实现跨平台绘图或多类型消息发送机制

    桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。以下是两个C++桥接模式,实现2种不同的场景:跨Windows/Linux平台绘图、多类型消息发送。

案例1:跨平台绘图

场景:开发一个跨平台图形应用,需要在不同操作系统(Windows、Linux)上绘制不同形状(圆形、矩形)。

实现

#include <iostream>
#include <string>// 实现部分接口:绘制API
class DrawingAPI {
public:virtual void drawCircle(double x, double y, double radius) = 0;virtual ~DrawingAPI() = default;
};// Windows平台实现
class WindowsDrawingAPI : public DrawingAPI {
public:void drawCircle(double x, double y, double radius) override {std::cout << "Windows: Circle at (" << x << "," << y << ") radius " << radius << std::endl;}
};// Linux平台实现
class LinuxDrawingAPI : public DrawingAPI {
public:void drawCircle(double x, double y, double radius) override {std::cout << "Linux: Circle at (" << x << "," << y << ") radius " << radius << std::endl;}
};// 抽象部分:形状
class Shape {
protected:DrawingAPI* drawingAPI;  // 桥接实现
public:explicit Shape(DrawingAPI* api) : drawingAPI(api) {}virtual void draw() = 0;virtual ~Shape() = default;
};// 具体形状:圆形
class Circle : public Shape {
private:double x, y, radius;
public:Circle(double x, double y, double radius, DrawingAPI* api): Shape(api), x(x), y(y), radius(radius) {}void draw() override {drawingAPI->drawCircle(x, y, radius);  // 委派给实现}
};// 客户端代码
int main() {DrawingAPI* windowsAPI = new WindowsDrawingAPI();DrawingAPI* linuxAPI = new LinuxDrawingAPI();Shape* circle1 = new Circle(1, 2, 3, windowsAPI);Shape* circle2 = new Circle(4, 5, 6, linuxAPI);circle1->draw();  // 输出: Windows: Circle at (1,2) radius 3circle2->draw();  // 输出: Linux: Circle at (4,5) radius 6delete circle1;delete circle2;delete windowsAPI;delete linuxAPI;return 0;
}

说明

  • 抽象部分Shape类及其子类(如Circle)。
  • 实现部分DrawingAPI接口及其具体实现(如WindowsDrawingAPI)。
  • 桥接:通过Shape类的构造函数注入具体的DrawingAPI实现,使形状和平台解耦。

案例2:多类型消息发送

场景:开发一个消息系统,支持多种消息类型(文本、邮件)和多种发送方式(同步、异步)。

实现

#include <iostream>
#include <string>// 实现部分接口:发送方式
class MessageSender {
public:virtual void send(const std::string& message) = 0;virtual ~MessageSender() = default;
};// 同步发送实现
class SyncSender : public MessageSender {
public:void send(const std::string& message) override {std::cout << "同步发送: " << message << std::endl;}
};// 异步发送实现
class AsyncSender : public MessageSender {
public:void send(const std::string& message) override {std::cout << "异步发送: " << message << std::endl;}
};// 抽象部分:消息
class Message {
protected:MessageSender* sender;
public:explicit Message(MessageSender* s) : sender(s) {}virtual void sendMessage() = 0;virtual ~Message() = default;
};// 具体消息:文本消息
class TextMessage : public Message {
private:std::string content;
public:TextMessage(const std::string& text, MessageSender* s) : Message(s), content(text) {}void sendMessage() override {sender->send("文本消息: " + content);}
};// 具体消息:邮件消息
class EmailMessage : public Message {
private:std::string subject;std::string body;
public:EmailMessage(const std::string& sub, const std::string& bd, MessageSender* s) : Message(s), subject(sub), body(bd) {}void sendMessage() override {sender->send("邮件: " + subject + "\n" + body);}
};// 客户端代码
int main() {MessageSender* sync = new SyncSender();MessageSender* async = new AsyncSender();Message* text1 = new TextMessage("紧急通知", sync);Message* text2 = new TextMessage("普通消息", async);Message* email = new EmailMessage("会议邀请", "明天上午10点开会", sync);text1->sendMessage();  // 输出: 同步发送: 文本消息: 紧急通知text2->sendMessage();  // 输出: 异步发送: 文本消息: 普通消息email->sendMessage();  // 输出: 同步发送: 邮件: 会议邀请...delete text1;delete text2;delete email;delete sync;delete async;return 0;
}

说明

  • 抽象部分Message类及其子类(如TextMessage)。
  • 实现部分MessageSender接口及其具体实现(如SyncSender)。
  • 桥接:通过Message类的构造函数注入具体的MessageSender实现,使消息类型和发送方式解耦。

桥接模式的核心价值

  1. 分离抽象与实现:抽象部分(如形状、消息)和实现部分(如平台、发送方式)可以独立扩展。
  2. 灵活组合:可以动态组合不同的抽象和实现,无需修改现有代码。
  3. 符合开闭原则:新增抽象或实现时,无需修改现有代码。
http://www.dtcms.com/a/288965.html

相关文章:

  • SpringBoot的介绍和项目搭建
  • 【C语言】字符串与字符函数详解(上)
  • C++ 详谈继承体系下的构造函数和析构函数
  • k8s:离线添加集群节点的相关组件安装与升级
  • GeoServer 信息泄漏漏洞复现(CVE-2025-27505)
  • 周志华《机器学习导论》第11章 特征选择与稀疏学习
  • 机器学习-数据预处理
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十六课——正弦波DDS的FPGA实现
  • leetcode75【经典动态规划】之:最长公共子序列
  • nginx源码解读-------整体架构
  • 30天打牢数模基础-LightGBM讲解
  • 网络地址和主机地址之间进行转换的类
  • springboot电影推荐网站—计算机毕业设计源码—30760
  • 在Ubutu22系统上面离线安装Go语言环境【教程】
  • 【开源项目】基于RuoYi-Vue-Plus的开源进销存管理系统
  • Spring之AOP面向切面编程详解
  • 软件工程学概述:从危机到系统化工程的演进之路
  • MySQL详解三
  • Java 字符集(Charset)详解:从编码基础到实战应用,彻底掌握字符处理核心机制
  • 文件编码概念|文件的读取操作|文件读取的课后练习讲解
  • 数据治理,治的是什么?
  • 0719代码调试记录
  • 【星海出品】python安装调试篇
  • 网络安全隔离技术解析:从网闸到光闸的进化之路
  • Spring Boot总结
  • RabbitMQ核心组件浅析:从Producer到Consumer
  • 深入理解设计模式:访问者模式详解
  • 深入理解浏览器解析机制和XSS向量编码
  • Java中List<int[]>()和List<int[]>[]的区别
  • React-Native开发环境配置-安装工具-创建项目教程