全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现一个桥接模式_C++设计模式之将抽象与实现分离

桥接模式通过分离抽象与实现,使二者独立变化。1. 定义Renderer基类声明渲染接口;2. OpenGLRenderer等子类实现具体渲染逻辑,提升系统可扩展性与可维护性。

桥接模式的核心是把抽象部分和它的实现部分分离,使它们可以独立变化。在C++中,这通常通过将“实现”抽取为独立的接口类,并在抽象类中持有该接口的指针来实现。这样,修改实现或扩展新的抽象都不需要重新编译对方,提升了系统的可扩展性和可维护性。

1. 定义实现接口(Implementor)

先定义一个实现类的基类,它提供实现层面的接口。这个类通常是一个纯虚类,由具体的实现类继承并完成具体逻辑。

class Renderer {
public:
    virtual ~Renderer() = default;
    virtual void renderCircle(float x, float y, float radius) = 0;
    virtual void renderRectangle(float x, float y, float width, float height) = 0;
};

2. 提供具体实现(Concrete Implementor)

实现类继承自Renderer,分别对应不同的渲染方式,比如OpenGL或DirectX。

class OpenGLRenderer : public Renderer {
public:
    void renderCircle(float x, float y, float radius) override {
        // 模拟OpenGL绘制圆
        std::cout << "OpenGL: Drawing circle at (" << x << ", " << y << ") with radius " << radius << "\n";
    }
void renderRectangle(float x, float y, float width, float height) override {
    std::cout << "OpenGL: Drawing rectangle at (" << x << ", " << y << ") size " << width << "x" << height << "\n";
}

};

class DirectXRenderer : public Renderer { public: void renderCircle(float x, float y, float radius) override { std::cout

void renderRectangle(float x, float y, float width, float height) override {
    std::cout << "DirectX: Drawing rectangle at (" << x << ", " << y << ") size " << width << "x" << height << "\n";
}

};

3. 定义抽象类(Abstraction)

抽象类包含一个指向Renderer的指针,所有图形操作都委托给该实现对象。它本身也可以被继承扩展。

class Shape {
protected:
    Renderer* renderer;

public: Shape(Renderer* r) : renderer(r) {}

virtual ~Shape() = default;

virtual void draw() = 0;
virtual void resize(float factor) = 0;

};

4. 创建具体抽象类(Refined Abstraction)

具体形状类如CircleRectangle继承自Shape,使用持有的renderer完成实际绘制。

class Circle : public Shape {
private:
    float x, y, radius;

public: Circle(Renderer* r, float x, float y, float radius) : Shape(r), x(x), y(y), radius(radius) {}

void draw() override {
    renderer->renderCircle(x, y, radius);
}

void resize(float factor) override {
    radius *= factor;
}

};

class Rectangle : public Shape { private: float x, y, width, height;

public: Rectangle(Renderer* r, float x, float y, float width, float height) : Shape(r), x(x), y(y), width(width), height(height) {}

void draw() override {
    renderer->renderRectangle(x, y, width, height);
}

void resize(float factor) override {
    width *= factor;
    height *= factor;
}

};

5. 使用桥接模式

客户端代码可以根据需要组合不同的形状和渲染器,无需修改原有类。

int main() {
    OpenGLRenderer opengl;
    DirectXRenderer directx;
Circle circle(&opengl, 10, 10, 5);
Rectangle rect(&directx, 0, 0, 4, 6);

circle.draw();  // 输出:OpenGL: Drawing circle...
rect.draw();    // 输出:DirectX: Drawing rectangle...

circle.resize(2);
circle.draw();  // 半径变为10后再次绘制

return 0;

}

桥接模式的关键在于解耦。你可以在不改动图形类的前提下添加新的渲染方式,也可以在不影响渲染器的情况下增加新的图形类型。这种结构特别适合多维度变化的系统设计。

基本上就这些。


# c++  # Float  # 子类  # void  # 指针  # 继承  # 接口  # class  # public  # private  # 委托  # 对象  # 桥接  # 抽象类  # 多维  # 是一个  # 都不  # 你可以  # 渲染器  # 并在  # 可以根据 


相关文章: 宁波免费建站如何选择可靠模板与平台?  如何在IIS管理器中快速创建并配置网站?  如何在宝塔面板中创建新站点?  如何选择高效稳定的ISP建站解决方案?  如何在腾讯云服务器上快速搭建个人网站?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何在阿里云购买域名并搭建网站?  建站之星免费版是否永久可用?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何用西部建站助手快速创建专业网站?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  济南企业网站制作公司,济南社保单位网上缴费步骤?  网页设计网站制作软件,microsoft office哪个可以创建网页?  网站制作网站,深圳做网站哪家比较好?  黑客如何通过漏洞一步步攻陷网站服务器?  定制建站流程步骤详解:一站式方案设计与开发指南  宁波自助建站系统如何快速打造专业企业网站?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何在腾讯云免费申请建站?  已有域名能否直接搭建网站?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  Python如何创建带属性的XML节点  建站主机SSH密钥生成步骤及常见问题解答?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  建站之星安装步骤有哪些常见问题?  如何选择网络建站服务器?高效建站必看指南  如何在云主机上快速搭建多站点网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何正确选择百度移动适配建站域名?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  Swift中循环语句中的转移语句 break 和 continue  佛山网站制作系统,佛山企业变更地址网上办理步骤?  简历在线制作网站免费版,如何创建个人简历?  如何在云指建站中生成FTP站点?  为什么Go需要go mod文件_Go go mod文件作用说明  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  制作销售网站教学视频,销售网站有哪些?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何用狗爹虚拟主机快速搭建网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  网站制作新手教程,新手建设一个网站需要注意些什么?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何基于PHP生成高效IDC网络公司建站源码?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何快速生成橙子建站落地页链接?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  如何选择域名并搭建高效网站?  如何在IIS7中新建站点?详细步骤解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。