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

在上篇 《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: // operationvoid 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 circlepainter.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 circleQRectF 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.mzph.cn/news/181863.shtml

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

相关文章

服务器修复

服务器修复 主要服务器漏洞展示未禁用sync、shutdown、halt默认账户。未创建系统管理员、审计管理员、安全管理员账户设置系统管理员设置安全管理员 设置审计管理员配置PASS_MAX_DAYS 99999、PASS_MIN_LEN 5未配置TMOUT值配置HISTSIZE0未配置登录失败/密码复杂度策略umask值022…

2021年2月18日 Go生态洞察:Go 1.16中的新模块变化

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

数字时代的表演艺术:TikTok如何重新定义舞台

在数字时代的潮流中&#xff0c;TikTok崭露头角&#xff0c;重新定义了表演艺术的舞台。这款短视频应用不仅改变了用户与内容的互动方式&#xff0c;也为艺术家和创作者提供了全新的表达平台。本文将深入探讨TikTok如何在数字时代重新定义舞台&#xff0c;以及它对表演艺术的深…

基于FPGA的五子棋游戏设计

基于FPGA的五子棋游戏设计 本文基于FPGA设计五子棋游戏&#xff0c;使用按键输入&#xff0c;使用VGA接口输出。五子棋的棋具与围棋相同&#xff0c;棋子分为黑白两色&#xff0c;棋盘为1010&#xff0c;棋子放置于棋盘线交叉点上。两人对局&#xff0c;各执一色&#xff0c;轮…

【IEEE出版】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 进入21世纪以来&#xff0c;计算机技术的高速发展带来了消费电子产品的快速更迭。在技术迅速发展历…

关于免费SSL证书

JoySSL是一家提供免费SSL证书的服务商&#xff0c;它的免费SSL证书不仅包括单域名&#xff0c;还包括多域名和通配符的免费证书。这意味着&#xff0c;无论您是只有一个网站的个人用户&#xff0c;还是拥有多个子域名的企业用户&#xff0c;都可以在JoySSL找到适合您的免费SSL证…

\n\r:解析java中的\r、\n、\r\n、\n\r的区别

1 \r 1.1 内容 回车符,将光标定义到当前行行首 1.2 在idea中测试 1.2.1 表现形式 在\r后有新内容时,会先删除之前以前存在过的文本,即只打印\r后面的内容 1.2.2 示例代码 package Work; public class Test05 { public static void main(String[] args) { System.…

Mysql七种高阶用法,让你少走弯路

首先先让我们创建表,SQL如下 CREATE TABLE moives (id int(11) NOT NULL AUTO_INCREMENT,movie_name varchar(200) COLLATE utf8mb4_bin DEFAULT NULL,actor_name varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,price decimal(10,0) DEFAULT NULL,release_date date DEFAULT …

【GEO-AI】SAM-Geo库(segment-geospatial)入门教程

今年4月份&#xff0c;Meta公布了它图形分割模型Segment-Anything&#xff0c;简称SAM。当时就想着这个东西用在遥感影像分割上应该效果不错&#xff0c;奈何自己能力有限&#xff0c;没有办法上手实践。偶然间看到有介绍SAM-Geo工具包的文章&#xff0c;决定研究一番&#xff…

Vue中使用正则表达式进行文本匹配和处理的方法

1. 正则表达式基础 正则表达式是一种用来匹配字符串的模式。它由普通字符&#xff08;例如字符 a 到 z&#xff09;和特殊字符&#xff08;称为"元字符"&#xff09;组成。以下是一些基本的正则表达式示例&#xff1a; 匹配邮箱的正则表达式&#xff1a; /^[\w-](\…

windows环境下载安装Nginx并配置防火墙

1、下载Nginx Nginx官网 下载稳定版 2、下载之后&#xff0c;解压 3、启动Nginx&#xff0c;命令&#xff1a;start nginx 最小化该窗口 主要&#xff0c;不要关闭&#xff0c;如果关闭&#xff0c;表示nginx服务关闭了 4、测试是否启动成功 在浏览器中输入http://localhos…

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题…

广州华锐视点:基于VR元宇宙技术开展法律法规常识在线教学,打破地域和时间限制

随着科技的飞速发展&#xff0c;人类社会正逐渐迈向一个全新的时代——元宇宙。元宇宙是一个虚拟的、数字化的世界&#xff0c;它将现实世界与数字世界紧密相连&#xff0c;为人们提供了一个全新的交流、学习和娱乐平台。在这个充满无限可能的元宇宙中&#xff0c;法律知识同样…

关于MongoDB

MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大&#xff0c;其…

Panorama SCADA平台助力智能建筑管理,掌控未来建筑!

来源&#xff1a;宏集科技 工业物联网 宏集方案 Panorama SCADA平台助力智能建筑管理&#xff0c;掌控未来建筑&#xff01; 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 前言 在现代智能建筑管理中&#xff0c;随着设施管理&#xff08;FM&#xff09;、建筑管理…

数据结构与算法--特殊的完全二叉树--堆,堆排序,利用堆解决topk的问题

目录 前言 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3 特殊的二叉树&#xff1a; 2.4 二叉树的性质 …

YOLOv7独家原创改进:自研独家创新MSAM注意力,通道注意力升级,魔改CBAM

💡💡💡本文自研创新改进:MSAM(CBAM升级版):通道注意力具备多尺度性能,多分支深度卷积更好的提取多尺度特征,最后高效结合空间注意力 1)作为注意力MSAM使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,对标CBAM。 在道路缺陷检测任务中,原始ma…

视频号小店如何运营?核心点是什么?实操详解!

我是电商珠珠 我做视频号小店也有一年的时间了&#xff0c;也拥有了自己的视频号小店团队。 很多新手对于视频号小店并不知道怎么做&#xff0c;总是偏离最初的重心&#xff0c;所以一部分人刚开始做的时候&#xff0c;觉得自己没有那个能力。 看着店铺的流量和销量日趋减少…

基于STM32+定时器中断和定时器外部时钟(标准库函数讲解)

前言 本篇博客主要学习了解定时器的标准库函数&#xff0c;以及定时器中断进行LED灯的反转&#xff0c;还有定时器外部时钟获取脉冲计数功能。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本篇博客主要是对通用定时器来讲解&#xff0c;功能适中比较常…

Java高级技术(注解)

一&#xff0c;注解 二&#xff0c;案例 三&#xff0c;注解原理 四&#xff0c;元注解 五&#xff0c;案例 六&#xff0c;解析注解 七&#xff0c;案例