【设计模式】非GOF的常见设计模型

news2024/11/24 11:12:51

结构型模式

在这里插入图片描述

系列综述:
来源:该系列是主要参考《大话设计模式》和《设计模式(可复用面向对象软件的基础)》,其他详细知识点拷验来自于各大平台大佬的博客。
总结:设计模式汇总篇
如果对你有用,希望关注·点赞·收藏一波。



😊点此到文末惊喜↩︎


生产者消费者模型

  1. 定义
    • 目的:多线程环境中,解决生产者消费者共享队列访问的同步问题(共享和互斥、同步和异步概念)
  2. 过程
    • 生产者:生成数据并放入共享队列(缓冲区)中
    • 消费者:从共享队列(缓冲区)中获取数据并进行消费
    • 共享队列的同步:使用PV信号量匹配生产者和消费者的速率差异
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
// 定义消息队列类
class MessageQueue {
public:
    MessageQueue () {}
    // 生产者生产数据放入消息队列中
    void push(string msg) {
        unique_lock<mutex> lock(m_mutex); // 1.上锁:保证{}范围内的互斥访问
        m_queue.push(msg);	// 2.生产:向消息队列中添加消息 
        m_cv.notify_one();	// 3.唤醒:唤醒在该条件变量上等待队列优先级最高的一个线程
        // m_cv.notify_all()会唤醒所有线程,但是会造成资源争用,要谨慎使用
    }

    // 消费者从消息队列中取出消息
    std::string pop() {
        std::unique_lock<std::mutex> lock(m_mutex);// 1. 上锁
        // 2. 队列为空则等待:如果队列为空,等待生产者添加消息
        while (m_queue.empty()) { 
            m_cv.wait(lock); // 使当前线程在条件变量上等待
        }
        // 3. 消费:取出消息并返回
        string msg = m_queue.front();
        m_queue.pop();
        return msg;
    }

private:
    mutex m_mutex; 				// 互斥锁:保证消息队列和条件变量的互斥访问
    condition_variable m_cv; 	// 条件变量:保证生产者和消费者的同步
    queue<std::string> m_queue;	// 消息队列:生产者和消费者的缓冲区
};

// 定义生产者线程函数
void producer(MessageQueue& mq) {
    for (int i = 0; i < 10; ++i) {
        std::string msg = "message " + std::to_string(i);
        mq.push(msg);
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); 
        // 生产者线程休眠一段时间
    }
}

// 定义消费者线程函数
void consumer(int id, MessageQueue& mq) {
    for (int i = 0; i < 5; ++i) {
        string msg = mq.pop();
        cout << "consumer " << id << " get message: " << msg << std::endl;
        this_thread::sleep_for(std::chrono::milliseconds(200)); 
        // 消费者线程休眠一段时间
    }
}

// 测试生产者消费者模型
int main() {
    MessageQueue mq;
    std::thread t1(producer, std::ref(mq));
    std::thread t2(consumer, 1, std::ref(mq));
    std::thread t3(consumer, 2, std::ref(mq));
    std::thread t4(consumer, 3, std::ref(mq));
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    return 0;
}


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
秘籍(点击图中书籍)·有缘·赠予你


🚩点此跳转到首行↩︎

参考博客

  1. 适配器模式
  2. 设计模式(四)——搞懂什么是代理模式
  3. 适配器模式
  4. c++设计模式:代理模式
  5. 代理模式
  6. 待定引用
  7. 待定引用
  8. 待定引用

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

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

相关文章

无需停服!PostgreSQL数据迁移工具-NineData

PostgreSQL 是一种备受开发者和企业青睐的关系型数据库&#xff0c;其丰富的数据类型、地理空间负载和强大的扩展能力等特性使其备受欢迎。然而&#xff0c;在企业使用 PostgreSQL 承载应用的过程中&#xff0c;由于业务需要上云、跨云、下云、跨机房迁移、跨地域迁移、数据库版…

C语言学习笔记---操作符详解

C语言程序设计笔记---012 C语言操作符1、算数操作符1.1、算术操作符例程 2、移位操作符2.1、移位操作符例程12.2、移位操作符例程22.3、移位操作符例程3 3、位操作符3.1、位操作符例程13.2、位操作符例程23.3、位操作符例程3 --按位与&1扩展3.4、位操作符例程4 --按位异或^…

使用SpringAop切面编程通过Spel表达式实现Controller权限控制

目录 参考一、概念SpEL表达式 二、开发引入包定义注解定义切面定义用户上下文 三、测试新建Service在方法上注解新建Service在类上注解运行 参考 SpringBoot&#xff1a;SpEL让复杂权限控制变得很简单 一、概念 对于在Springboot中&#xff0c;利用自定义注解切面来实现接口…

LVGL学习笔记 30 - List(列表)

目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形&#xff0c;可以向其中添加按钮和文本。 lv_obj_t* list1 lv_list_create(lv_scr_act());lv_obj_set_size(list1, 180, 220);lv_obj_center(list1); 部件包含&…

Linux命令200例:adduser用于创建新用户

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

求Win11系统virtualbox+vagrant安装MacOS虚拟机

文章目录 一、背景二、素材2.1、virtualboxvagrant 三、问题3.1、安装失败3.2、第二个失败3.3、网络说 四、求助 一、背景 题主&#xff0c;主要是穷&#xff0c;没钱买mac笔记本或相关系统的苹果产品&#xff0c;哈哈&#xff0c;偶尔也有用过MacOS系统&#xff0c;只是还没有…

app专项测试:app弱网测试

目录 弱网测试背景 网络测试要点 弱网测试关注指标 弱网测试工具 fiddler模拟网络延时场景 网络设置参考 Network Emulator Toolkit模拟网络丢包场景&#xff08;windows网络&#xff09; APP弱网测试 弱网使用工具&#xff1a; app弱网测试要点 APP网络测试要点 网络…

OpenCV图像处理——模版匹配和霍夫变换

目录 模版匹配原理实现 霍夫变换霍夫线检测 模版匹配 原理 实现 rescv.matchTemplate(img,template,method)import numpy as np import cv2 as cv import matplotlib.pyplot as pltimgcv.imread(./汪学长的随堂资料/6/模板匹配/lena.jpg) templatecv.imread(./汪学长的随堂资…

一文搞懂Jenkins持续集成解决的是什么问题

1、持续集成的定义 大师 Martin Fowler 是这样定义持续集成的: 持续集成是一种软件开发实战, 即团队开发成员经常集成他们的工作. 通常, 每个成员每天至少集成一次, 也就意味着每天可能发生多次集成. 持续集成并不能消除Bug, 而是让它们非常容易发现和改正. 根据对项目实战的…

uniapp开发小程序-有分类和列表时,进入页面默认选中第一个分类

一、效果&#xff1a; 如下图所示&#xff0c;进入该页面后&#xff0c;默认选中第一个分类&#xff0c;以及第一个分类下的列表数据。 二、代码实现&#xff1a; 关键代码&#xff1a; 进入页面时&#xff0c;默认调用分类的接口&#xff0c;在分类接口里做判断&#xff…

Android 网络编程-网络请求

Android 网络编程-网络请求 文章目录 Android 网络编程-网络请求一、主要内容二、开发网络请求前的基本准备1、查看需要请求的网址是否有效&#xff08;1&#xff09;通过网页在线验证&#xff08;2&#xff09;使用专用window网咯请求工具&#xff08;3&#xff09;编写app代码…

less学习语法

1.CSS函数的补充 1.rgb/rgba/translate/rotate/scale 2.非常好用的css函数&#xff1a; var:使用css定义的变量calc:计算css值&#xff0c;通常用于计算元素的大小或位置blur:毛玻璃&#xff08;高斯模糊&#xff09;效果gradient:颜色渐变函数 var:定义变量 css中可以自定…

关于青少年学习演讲与口才对未来的领导力的塑造的探析

标题&#xff1a;青少年学习演讲与口才对未来领导力的塑造&#xff1a;一项探析 摘要&#xff1a; 本论文旨在探讨青少年学习演讲与口才对未来领导力的塑造的重要性和影响。通过分析演讲和口才对青少年的益处&#xff0c;以及如何培养这些技能来促进领导力的发展&#xff0c;我…

pytest数据驱动 pandas

pytest数据驱动 pandas 主要过程&#xff1a;用pandas读取excel里面的数据&#xff0c;然后进行百度查询&#xff0c;并断言 pf pd.read_excel(data_py.xlsx, usecols[1,2])print(pf.values)输出&#xff1a;[[‘听妈妈的话’ ‘周杰伦’] [‘遇见’ ‘孙燕姿’] [‘伤心太平…

win10下如何安装ffmpeg

安装ffmpeg之前先安装win10 绿色软件管理软件&#xff1a;scoop. Scoop的基本介绍 Scoop是一款适用于Windows平台的命令行软件&#xff08;包&#xff09;管理工具&#xff0c;这里是Github介绍页。简单来说&#xff0c;就是可以通过命令行工具&#xff08;PowerShell、CMD等…

性能优化-超大图加载

超大图加载优化 网站首页的头部有时候要加载超大图&#xff0c;可能超过4M&#xff0c;如果网速不好用户会看到好长时间的白屏&#xff0c;体验非常不好。 这里使用大图缩略图的模式处理这个问题&#xff1a; 使用工具根据大图(>1M)做一个10k的缩略图图片同时加载&#xf…

这所院校性价比极高!专业课太简单了!保护一志愿!

一、学校及专业介绍 昆明理工大学&#xff08;Kunming University of Science and Technology&#xff09;&#xff0c;位于云南省昆明市&#xff0c;是国防科技工业局与云南省共建的重点大学&#xff0c;国家"特色重点学科项目"建设高校。昆工就综合实力和竞争压力…

Vue 引入 Element-UI 组件库

Element-UI 官网地址&#xff1a;https://element.eleme.cn/#/zh-CN 完整引入&#xff1a;会将全部组件打包到项目中&#xff0c;导致项目过大&#xff0c;首次加载时间过长。 下载 Element-UI 一、打开项目&#xff0c;安装 Element-UI 组件库。 使用命令&#xff1a; npm …

Camx--概述

该部分代码主要位于 vendor/qcom/proprietary/ 目录下&#xff1a; 其中 camx 代表了通用功能性接口的代码实现集合&#xff08;CamX&#xff09;&#xff0c;chi-cdk代表了可定制化需求的代码实现集合&#xff08;CHI&#xff09;&#xff0c;从图中可以看出Camx部分对上作为H…