C++设计模式——Bridge模式(下)

news2025/1/20 14:57:14

在上篇 《C++设计模式——Bridge模式(上)》中我们对于桥接模式做了一些介绍。介于桥接模式在实际项目开发中使用广泛,而且也是面试中常问常新的话题。在本篇,我们专注bridge模式在具体的项目开发中的应用,举几个例子来说明。

#ifndef SHAPE_H
#define SHAPE_H

#include <QObject>
#include <QWidget>
#include <QColor>
#include <QPointF>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QDebug>

class ShapeImp;

class Shape
{

public:
    virtual void draw() = 0;

    virtual void setLineColor(const QColor& color) = 0;
    virtual void setLineWidth(const int width) = 0;
    virtual ~Shape() {}
protected:
    Shape(ShapeImp* imp) : imp_(imp) {}
    ShapeImp* imp_;
};


class ShapeImp : public QWidget
{
public:
    virtual void draw() = 0;
    virtual void setLineColor(const QColor& color) = 0;
    virtual void setLineWidth(const int width) = 0;
    virtual ~ShapeImp() {}
protected:
    ShapeImp(QWidget* parent = nullptr):QWidget(parent) {}
    friend class Shape;
};


class ShapeImpWin : public Shape
{
public:
    ShapeImpWin(ShapeImp* pImpl) : Shape(pImpl) {}
public: // operation
    void draw() override{ imp_->draw(); }
    void setLineColor (const QColor& color) override { imp_->setLineColor(color); }
    void setLineWidth(const int width) override { imp_->setLineWidth(width);}
};



class Circle : public ShapeImp
{
    Q_OBJECT
public:
    Circle(const QPointF& center,qreal raduis,QWidget* parent = nullptr)
        : m_center(center),m_raduis(raduis),ShapeImp(parent){}

    void draw(){ update(); }

    void setLineColor(const QColor& color) override {m_color = color;}
    void setLineWidth(const int width) override{ m_lineWidth = width; }

    virtual void paintEvent(QPaintEvent* e) override
    {
        QPainter painter(this);
        QPen pen;
        pen.setColor( m_color /*QColor(Qt::red)*/);
        pen.setWidth(m_lineWidth);

        QBrush brush;
        brush.setColor(QColor(Qt::lightGray));
        painter.setPen(pen);
        painter.setBrush(brush);

        // draw circle
        painter.drawEllipse(m_center,m_raduis,m_raduis);

        e->accept();
    }

private:
    QPointF m_center;
    qreal m_raduis = 50;
    QColor m_color = QColor(Qt::black);
    int m_lineWidth = 1;
};

class Rectange : public ShapeImp
{
    Q_OBJECT
public:
    Rectange(const QPointF& topleft,qreal width,qreal height,QWidget* parent = nullptr)
        : m_topleft(topleft),m_width(width),m_height(height),ShapeImp(parent){}

    void draw(){ update(); }

    void setLineColor(const QColor& color) override {m_color = color;}
    void setLineWidth(const int width) override{ m_lineWidth = width; }

    virtual void paintEvent(QPaintEvent* e) override
    {
        QPainter painter(this);
        QPen pen;
        pen.setColor( m_color /*QColor(Qt::red)*/);
        pen.setWidth(m_lineWidth);

        QBrush brush;
        brush.setColor(QColor(Qt::lightGray));
        painter.setPen(pen);
        painter.setBrush(brush);

        // draw circle
        QRectF r(m_topleft.x(),m_topleft.y(),m_width,m_height);
        painter.drawRect(r);

        qDebug() << r;

        e->accept();
    }

private:
    QPointF m_topleft;
    qreal m_width = 100;
    qreal m_height = 100;
    QColor m_color = QColor(Qt::black);
    int m_lineWidth = 1;
};
#endif // SHAPE_H
#include "board.h"

#include <QApplication>
#include "shape.h"
#include <QHBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    ShapeImp* pImpl_circle = new Circle(QPointF(100,100),80);
    pImpl_circle->setFixedSize(300,300);
    Shape* pShape = new ShapeImpWin(pImpl_circle);
    pShape->setLineWidth(1);
    pShape->setLineColor(QColor(Qt::red));
    pShape->draw();
    pImpl_circle->show();

    ShapeImp* pImpl_rect = new Rectange(QPointF(10,10),80,80);
    pImpl_rect->setFixedSize(300,300);
    Shape* pShap1 = new ShapeImpWin(pImpl_rect);
    pShap1->setLineWidth(1);
    pShap1->setLineColor(QColor(Qt::red));
    pShap1->draw();
    pImpl_rect->show();

    return a.exec();
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1269056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统安装-以文本模式安装rhel8

文本模式安装提供了用于安装 Red Hat Enterprise Linux 的交互式非图形界面。此安装方法对于没有图形功能的系统很有用。但是&#xff0c;在开始基于文本的安装之前&#xff0c;请务必考虑可用的替代方案。文本模式在安装过程中可以做出的选择数量有限。 目录 交互式文本模式安…

深入理解 Vue 中的指针操作(二)

文章目录 ☘️引言☘️基本用法&#x1f342;v-for指令&#x1f342;v-model指令&#x1f331;v-model适用表单控件 ☘️结论 ☘️引言 Vue.js 是一款非常流行且功能强大的前端框架&#xff0c;它以其响应式的数据绑定和组件化的开发方式赢得了众多开发者的喜爱。而在 Vue.js …

OKCC 客户中心

OKCC服务了这么多家客户中心&#xff0c;但很多小伙伴们其实并不是太了解客户中心的主要功能&#xff0c;那么我今天将从两类客户中心介绍下他们的主要功能。 一、 运营机构客户中心的功能 对于运营机构而言&#xff0c;客户中心的功能包括:能够帮助运营机构提升品牌形象&…

Chrome两个账号数据合并或者转移

文章目录 情况1情况2操作 情况1 「旧」账号&#xff1a;出于种种原因决定停用&#xff0c;但是账号里还有书签、历史记录、密码、设置等数据。 「新」账号&#xff1a;未来的主力账号。 需求是将「旧账号」的数据迁移到「新」账号之中。 情况描述&#xff1a;https://www.z…

openGauss学习笔记-134 openGauss 数据库运维-例行维护-检查操作系统参数

文章目录 openGauss学习笔记-134 openGauss 数据库运维-例行维护-检查操作系统参数134.1 检查办法134.2 异常处理 openGauss学习笔记-134 openGauss 数据库运维-例行维护-检查操作系统参数 134.1 检查办法 通过openGauss提供的gs_checkos工具可以完成操作系统状态检查。 前提…

Golang数据类型(字符串)

字符串重要概念 根据Go语言官方的定义&#xff1a; In Go, a string is in effect a read-only slice of bytes. 意思是Go中的字符串是一组只读的字节切片&#xff08;slice of bytes&#xff09;&#xff0c;每个字符串都使用一个或多个字节表示&#xff08;当字符为 ASCII 码…

医院室内导航解决方案:智慧医疗的重要组成部分

医院作为人们生活中不可或缺的一部分&#xff0c;面临着巨大的挑战。每天都有大量的患者前来就医&#xff0c;而医院内部的复杂结构和科室众多&#xff0c;常常让患者感到困惑和迷失。为了解决这个问题&#xff0c;医院室内导航解决方案应运而生&#xff0c;以其创新的技术和卓…

4G工业路由器智慧楼宇门禁无人值守、实时监控

门禁是我们日常生活中常见的基础设施&#xff0c;就像是现代社会智慧城市中的“门神”&#xff0c;在楼宇管理领域中普遍采用的安防卫士。4G工业路由器的物联网应用则为楼宇门禁管理带来了更加便捷和高效的解决方案。 在传统的楼宇门禁系统中&#xff0c;人员需要手动刷卡、输…

多个加速度计/麦克风连接指引

座舱内的振动投诉&#xff1a;如乘客/驾驶员在车厢内感受到传动轴、方向盘抖动剧烈 图1.三轴模式下的单个加速度计 图2.软件设置界面 如果您只有一个加速度计&#xff0c;可以在三轴模式下使用一个加速度计找出客户投诉车厢内振动最强烈的区域。例如将加速度计连接到驾驶员座椅…

PCIe学习必读——《PCI Express System Architecture》

PCI Express (peripheral component interconnect express) 简称 PCIe&#xff0c;是一种高速串行计算机扩展总线标准。是一种全双工总线&#xff0c;使用高速串行传送方式&#xff0c;能够支持更高的频率&#xff0c;连接的设备不再像 PCI 总线那样共享总线带宽。PCIe目前发布…

完美滤波器

完美滤波器 如下图所示&#xff0c;第 j j j级为输入图像&#xff0c;其中第 j − 1 j-1 j−1级为第 j j j级的尺寸减半的存在&#xff0c;直至为 1 1 1\times 1 11 的大小&#xff0c;这样的模式被称为图像金字塔 设原图像像素点个数为 N 2 N^2 N2&#xff0c;则图像金字塔的…

IP地址规划的基本方法与最佳实践

IP地址规划是建立网络基础设施的关键步骤之一&#xff0c;它涉及到为网络中的设备分配唯一的IP地址&#xff0c;确保网络的高效性和可管理性。本文将介绍IP地址规划的基本方法和最佳实践&#xff0c;以帮助网络管理员设计并维护高效的IP地址方案。 1. 了解网络拓扑结构&#x…

Java的字符流和字节流

Java的字节流&#xff1a;把数据从程序存储到文件&#xff0c;把数据从文件读取程序中 File&#xff1a;只操作文件和文件属性&#xff0c;createNewFile getPath--->项目目录 ,getAbsolutePath() getName()---->substring() list()-->列出当前目录的所有文件或文…

vue+less+style-resources-loader 配置全局颜色变量

全局统一样式后&#xff0c;可配置vue.config.js实现全局颜色变量&#xff0c;方便在编写时使用统一风格的色彩 一、新建global.less 二、下载安装style-resources-loader npm i style-resources-loader --save-dev三、在vue.config.js中进行配置 module.exports {pluginOpt…

架构图是什么,该怎么制作?

架构图是指可视化展示软件、系统、应用程序、网络等各种体系结构的一类图表或图形&#xff0c;它能够形象地展示体系结构中各个组成部分和它们之间的关系。 架构图的类型 架构图的种类比较多&#xff0c;逐一列举不太合适&#xff0c;这里只列举一些常见的架构图类型&#…

爬虫-基于python的旅游景点推荐系统的设计与实现-计算机毕业设计源码24044

摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于旅游景点管理也是十分常见的。过去使用手工的管理方式对旅游景点进行管理&#xff0c;造成了管理繁琐、难以维护等问题&#xff0c;如今使用计算机对旅游景点的各项基本信息进…

2021年2月16日 Go生态洞察:Go 1.16版本发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CentOS 7 部署 Nacos (单机版)

CentOS 7 部署 Nacos &#xff08;单机版&#xff09; 1. 下载 Nacos 安装包 历史版本&#xff1a;https://github.com/alibaba/nacos/releases/ 我选的是 2.1.0 版本&#xff0c;https://github.com/alibaba/nacos/releases/download/2.1.0/nacos-server-2.1.0.tar.gz 2. …

2021年09月 Scratch图形化(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 程序中要使用不确定的数值,这时要用到的是?( ) A、图章 B、变量 C、广播 D、随机数 答案:D 第2题 执行下列程序后,角色会说?( ) A、3 B、6 C、10 D、15 答案:D 第3题…

现货白银怎样数点数?

由于数十倍资金杠杆的存在&#xff0c;现货白银投资者可以把很细微的行情波动&#xff0c;转化为相对显著的收益。但另一方面&#xff0c;现货白银交易过程中会难免会涉及一定的点差成本&#xff0c;所以投资者在入市之前&#xff0c;一定要清晰地知道自己需要能够拿下多少的行…