C++设计模式
单例模式
单例模式保证一个类只能创建一个对象,并提供全局访问点。通常用于全局共享例如日志、数据库连接池等。
Lazy Initialization
优点:需要时才初始化,节省空间
缺点:线程不安全
class Singleton{
private:static Singleton* instance;//提供的静态成员Singleton() {}//重写构造函数为私有,禁止使用通常方法创建Singleton
public://外界只能通过getInstance去获取静态成员,从而保证只有一个实例ststic Singleton* getInstance(){if(instance == nullptr)instance = new Singleton();//可能会有多个线程同时执行这句,导致问题return instance;}
}
Eager Initialization
优点:线程安全
缺点:不管用不用都会初始化,占空间
class Singleton{
private:static Singleton* instance;Singleton(){}
public:static Singleton* getInstance(){return instance;}
}Singleton* Singleton::instance = new Singleton();
Double-Checked Locking
优点:延迟加载、线程安全
缺点:没有
#include <mutex>class Singleton{
private:static volatile Singleton* instance;static std::mutex mtx;Singleton(){}
public:static volatile Singleton* getInstance(){if(instance == nullptr){std::lock_guard<std::mutex> lock(mtx);if(instance == nullptr){ //double-checked lockinginstance = new Singleton();}}return instance; }
};volatile Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
代理模式
我要租房,我不去租,找了个中介去租。
class Person{
public:virtual void rentHouse() = 0;//纯虚函数
};class I : public Person{
public:void rentHouse(){std::cout << "I want to rent a house."<<endl;}
};class Intermediary : public Person{
public: Intermediary(Person * person) : m_person(person) {}void rentHouse(){m_person->rentHouse();std::cout << "I'am Intermediary."<<endl;}
private:Person *m_person;
};void testDalegate()
{Person *i = new I();Person *intermediary = new Intermediary(i);intermediary->rentHouse();
}
简单工厂模式
简单工厂模式是一种实例化对象的方式,只要我们输入的实例化信息,就可以通过工厂方式实例化相应的实例化对象。
class TelPhone{
public:enum PhoneType{Mi, Oppo, Huawei};virtual void setName(std::string name) = 0;virtual void setPrice(double price) = 0;virtual double getPrice() = 0;
protected:std::string name;double price;
};class MiPhone : public TelPhone{
public: Miphone(){setname("mi15");setprice(1234)}std::string getName(){return TelPhone::name;}std::double getPrice(){return TelPhone::Price;}void setName(std::string name){TelPhone::name = name;}void setPrice(double price){TelPhone::price = price;}};
class OppoPhone : public TelPhone{//...
};
class HuaWeiPhone : public TelPhone{//...
};class TelPhoneFactory{
public://生产手机static TelPhone* productTelPhone(TelPhone::PhoneType phoneType){TelPhone *telp = nullptr;swith(phoneType){case TelPhone::Mi:telp = new Miphone();break;case TelPhone::Oppo:telp = new Oppophone();break;case TelPhone::Huawei:telp = new Huaweiphone();break;default:break;}return telp;}
};void testFactory(){TelPhone *telp = TelPhoneFactory::productTelPhone(TelPhone::Mi);if(telp != nullptr){std::cout<<telp->getName() << std::endl;std::cout<<telp->getPrice() << std::endl;}
}
观察者模式
又叫发布-订阅模式,定义对象间一对多的关系,当一个对象状态发生变化时,其所有依赖者都会收到通知
原型模式
用一个以及创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或者相似的对象。类似原件和复印件的关系。
策略模式
定义一系列算法,把他们一个个封装起来,并且使他们可以相互替换。通过策略模式,可以动态的选择、配置和切换算法,而无需修改客户端代码。
#include<iostream>enum StrategyType{E_StrategyNight,E_StraegyWeekend,
};
class Strategy{
public:virtual void algorithm() = 0;virtual ~Strategy(){}
};class StrategyNight : public Strategy{
public:void algorithm(){std::cout << "晚上加班计算方法"<<std::endl;}virtual ~StrategyNight(){}
};class StraegyWeekend : public Strategy{
public:void algorithm(){std::cout<<"周末加班"<<std::endl;}virtual ~StraegyWeekend(){}
};class Context{
public:Context(StrategyType strategyType){switch (strategyType){case E_StrategyNight:pStrategy = new StrategyNight();break;case E_StraegyWeekend:pStrategy = new StraegyWeekend();break;default:break;}}~Context(){if(pStrategy)delete pStrategy;}void overtimePay(){if(pStrategy){pStrategy->algorithm();}}
private:Strategy* pStrategy;
};int main(){Context *pcont = new Context(E_StraegyWeekend);pcont->overtimePay();if(pcont)delete pcont;return 0;
}
中介者模式
定义一个中介对象来封装一系列对象之间的交互,使得原有对象之间的耦合松散,且可以独立地改变他们之间的交互。

#include<iostream>
#include<vector>
#include<string>
using namespace std;class Employee{
private:string m_strName;string m_strContent;
public:Employee(string strName) : m_strName(strName){}void setName(string strName){m_strName = strName;}string getName(){return m_strName;}void setContent(string content){m_strContent = content;}string getContent(){if(m_strContent.empty())return "收到";return m_strContent;}virtual void talk() = 0;
};class Boss : public Employee{
public:Boss(string str) :Employee(str){}void talk(){cout << getName() << " says: " << getContent()<<endl;}
};class Manager : public Employee{
public:Manager(string str) :Employee(str){}void talk(){cout << getName() << " says: " << getContent()<<endl;}
};
class Securtity: public Employee{
public:Securtity(string str) :Employee(str){}void talk(){cout << getName() << " says: " << getContent()<<endl;}
};class Mediator{
protected:vector<Employee*> vec_emp;public:void addEmployee(Employee* emp){vec_emp.push_back(emp);}virtual void notify(Employee* emp) = 0;
};class HolidaysMediator : public Mediator{
public:void notify(Employee* emp){ emp->talk();for(int i = 0; i < vec_emp.size(); i++){if(emp != vec_emp[i]){vec_emp[i]->talk();}}}
};int main(){HolidaysMediator holidaysMediator;Boss* boss = new Boss("老板");Manager* manager = new Manager("经理");Securtity* securtity = new Securtity("保安");holidaysMediator.addEmployee(boss);holidaysMediator.addEmployee(manager);holidaysMediator.addEmployee(securtity);boss->setContent("明天放假");holidaysMediator.notify(boss);return 0;}
责任链模式
用来处理相关事务的一条执行链,执行链上有多个节点,每个节点都有机会处理请求事务,如果某个节点处理完就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。

#include<iostream>
using namespace std;class Logger{
public:enum LEVEL {DEBUG,INFO,WARN,ERROR };LEVEL m_level = LEVEL::DEBUG;Logger(){ }virtual ~Logger(){}void logMessage(LEVEL level, string message){if(m_level <= level){write(message);}if(m_nextLogger != NULL){m_nextLogger->logMessage(level, message);}}void setNextLogger(Logger* nextLogger){m_nextLogger = nextLogger;}
protected:virtual void write(string logger){};Logger* m_nextLogger;
};class DebugLogger : public Logger{
public:DebugLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Debug Logger: " << m_level<< ", message:"<<logger<<endl;}
};
class ErrorLogger : public Logger{
public:ErrorLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Error Logger: " << m_level<< ", message:"<<logger<<endl;}
};class InfoLogger : public Logger{
public:InfoLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Info Logger: " << m_level<< ", message:"<<logger<<endl;}
};class WarnLogger : public Logger{
public:WarnLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Warn Logger: " << m_level<< ", message:"<<logger<<endl;}
};class Client{
public:Client(){}~Client(){}void test(){Logger *logger = getChainOfLoggers();logger->logMessage(Logger::DEBUG, "this is debug");cout << "--------------"<<endl;logger->logMessage(Logger::DEBUG, "this is info");cout << "--------------"<<endl;logger->logMessage(Logger::DEBUG, "this is warn");cout << "--------------"<<endl;logger->logMessage(Logger::DEBUG, "this is error");}
private:Logger* getChainOfLoggers(){Logger *debug = new DebugLogger(Logger::DEBUG);Logger *info = new InfoLogger(Logger::INFO);Logger *warn = new WarnLogger(Logger::WARN);Logger *error = new ErrorLogger(Logger::ERROR);error->setNextLogger(warn);warn->setNextLogger(info);info->setNextLogger(debug);return error;}
};int main(){Client client;client.test();return 0;
}

相关文章:
C++设计模式
单例模式 单例模式保证一个类只能创建一个对象,并提供全局访问点。通常用于全局共享例如日志、数据库连接池等。 Lazy Initialization 优点:需要时才初始化,节省空间 缺点:线程不安全 class Singleton{ private:static Singlet…...
反向代购业务系统|无货源代购中国商品|反向海淘代购系统
什么是淘宝代购 淘宝代购是近年兴起的一种购物模式,是帮国外客户购买中国商品。主要是通过万邦科技的外贸代购模式,把淘宝、 天猫等电商平台的全站商品通过API接入到你的网站上,瞬间就可以架设一个有数亿产品的大型网上商城,而且…...
Linux 进程间通信
目录 管道 匿名管道(pipe) 有名管道(fifo) 小结 共享内存 消息队列 信号量 System V IPC的结构设计 Posix与System V的关系 管道 匿名管道(pipe) 我们知道,在Linux中通过fork创建的子…...
hippy 调试demo运行联调-mac环境准备篇
适用对于终端编译环境不熟悉的人看,仅mac端 hippy 调试文档官网地址 前提:请使用node16 联调预览效果图: 编译iOS Demo环境准备 未跑通,待补充 编译Android Demo环境准备 1、正常安装Android Studio 2、下载Android NDK&a…...
【golang】go module依赖的git tag被覆盖 如何处理 | 因测试产生大量的git tag 如何清除 最佳实践
一、场景 当我们把本地和远程git仓库的 tag全部删除,我们另外的项目依赖于这个被删除tag无法更新版本 如何处理? 如上图: 这里我创建了一个 v0.0.1 的tag,然后删除了这个tag,然后又创建了一个新的 v0.0.1的tag…...
Spring Cloud原理详解
Spring Cloud 是基于 Spring Boot 的微服务架构开发工具包,旨在帮助开发人员快速构建分布式系统中的一些常见模式,例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、领导选举、分布式会话和集群状态。Spring Cloud 是 Spring 生态系…...
力扣76. 最小覆盖子串(滑动窗口)
Problem: 76. 最小覆盖子串 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义两个map集合need和window(以字符作为键,对应字符出现的个数作为值),将子串t存入need中; 2.定义左右指针left、right均指向0ÿ…...
使用华为云云函数functiongraph
之前使用腾讯云serverless,但是突然开始收费了。所以改用functiongraph 首先登陆华为云。 目录 1.登录华为云 2.在控制台找到functiongraph并开通 3.添加依赖包: 3.1 制作依赖包 3.2引入依赖包 4.发送请求 4.1直接发送 4.1.1uri 4.1.2 请求头…...
Android logcat系统
一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具,可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别: /…...
android 使用协程CoroutineScope 实现定时器
满足延迟执行、立即执行,每次任务间隔时长,总时长的任务 使用1 class TimeViewModel:Viewmodel(){//测试延迟5秒开始执行任务,然后每隔1秒执行1次,总执行时间60秒fun testTime(){var startTime System.currentTimeMillis()log(…...
【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:AcWing算法学习笔记 💬总结:希望你看完…...
UnityShader——09数学知识3
方阵 行与列数量相等的矩阵,n*n阶矩阵 对角矩阵 当对角线以外的矩阵内元素全为0,则称之为对角矩阵,对角矩阵的前提是必须是方阵 单位矩阵 对角线元素全为1,其余元素全为0,属于对角矩阵的一部分 矩阵和向量 把1 * n阶矩阵称…...
langchain学习笔记(九)
RunnableBranch: Dynamically route logic based on input | 🦜️🔗 Langchain 基于输入的动态路由逻辑,通过上一步的输出选择下一步操作,允许创建非确定性链。路由保证路由间的结构和连贯。 有以下两种方法执行路由 1、通过Ru…...
周处除三害在线资源最新电影1080p高清
打开下面这个链接就可以看到 周处除三害在线资源最新电影1080p高清 如果链接打不开,就复制下面的网址到浏览器打开 https://www.zhufaka.cn/liebiao/A09504AE3BF8BD06 用阿里云盘下载,下载完成之后,用迅雷播放 周处除三害在线资源最新电…...
STM32CubeIDE基础学习-新建STM32CubeIDE基础工程
STM32CubeIDE基础学习-新建STM32CubeIDE基础工程 前言 有开发过程序的朋友都清楚,后面开发是不需要再新建工程的,一般都是在初学时或者有特殊需要的时候才需要新建项目工程的。 后面开发都是可以在这种已有的工程上添加相关功能就行,只要前…...
R语言简介|你对R语言了解多少?
R语言是一种专门用于统计计算和图形展示的开源编程语言,它在数据科学领域有着广泛的应用。下面对R语言的环境、基础语法及注释进行解释: R语言环境 安装与配置 安装R语言通常可以从官方站点下载对应操作系统的安装包,如Windows、Linux、ma…...
Android的硬件接口HAL
我一直觉得,现代计算机不是一门科学,起码快算不上一门理科科学。上上下下全是人造,左左右右全是生意,用管理学,经济学去学计算机,也许更看得懂很多问题。HAL就是一个典型例子。 传统Linux绕开了微软的霸权…...
【js】数组的常用方法
增加 push,unshift,splice,concat 前面三种修改原数组,concat不会修改原数组push 从后面添加数据,并返回新数组的长度unshift 从前面添加数据,并返回新数组的长度splice 可以接受三个参数,第一个参数开始位置,第二个参数是删除元素的数量,第三个参数是插入的数据concat 合并数…...
08. Nginx进阶-Nginx动静分离
简介 什么是动静分离? 通过中间件将动态请求和静态请求进行分离。分离资源,减少不必要的请求消耗,减少请求延时。 动静分离的好处 动静分离以后,即使动态服务不可用,静态资源仍不受影响。 动静分离示意图 动静分离…...
RPC--一起学习吧之架构
RPC(远程过程调用)是一种网络通信协议,它允许一台计算机(客户端)上的程序调用另一台计算机(服务器)上的程序,就像调用本地程序一样。RPC 可以使得网络中的不同进程能够相互调用&…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
