当前位置: 首页 > news >正文

C++设计模式

管理变化, 提高复用

两种手段:分解  抽象

八大原则:https://blog.csdn.net/mmk27_word/article/details/108521903

重构技法:

静态 -> 动态
早绑定 -> 晚绑定
继承 -> 组合
编译时依赖 -> 运行时依赖
紧耦合 -> 松耦合

关注抽象类&接口(基类比子类更加有用)
理清变化点和稳定点
审视依赖关系

高内聚,松耦合

重在通过八大原则去理解

解决的问题:

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设回计经验的总结。答使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式最主要解决的问题是通过封装和隔离变化点来处理软件的各种变化问题。
隔离变化的好处在于,将系统中经常变化的部分和稳定的部分隔离,有助于增加复用性,并降低系统耦合度。很多设计模式的意图中都明显地指出了其对问题的解决方案,学习设计模式的要点是发现其解决方案中封装的变化点。

GitHub上代码例子:https://github.com/liu-jianhao/Cpp-Design-Patterns

b站视频:https://www.bilibili.com/video/BV1cW41157n1?p

别人的整理:https://www.cnblogs.com/ssyfj/category/1283709.html

单例:

#include <iostream>
#include <cassert>
#include <atomic>
#include <vector>
#include <thread>
#include <sstream>
#include <mutex>
using namespace std;
mutex mu;
class Single {
private:static atomic<Single*>  m_Single;static int count;static mutex  singlemu;Single() { cout << " 构造 " << endl; }Single(const Single& single) {}Single& operator=(const Single& single){}
public:static  Single* getSingle() {// 多线程下在外加锁安全 在内不安全 :分配内存 调用构造函数 返回指针 2 3顺序可能颠倒// mu.lock();Single* tmp = m_Single.load(memory_order_relaxed);atomic_thread_fence(memory_order_acquire);if (tmp == nullptr) {//mu.lock();lock_guard<mutex> lock(singlemu);tmp = m_Single.load(memory_order_relaxed);if (tmp == nullptr) {tmp = new Single;count++;    atomic_thread_fence(memory_order_release);m_Single.store(tmp, memory_order_relaxed);}//mu.unlock();}cout << count << endl;//mu.unlock();return m_Single;}void print() {cout << "print\n";}
};
atomic<Single*>  Single::m_Single;
mutex Single::singlemu;
static int count;
mutex  singlemu;
int Single::count = 0;
void func() {Single::getSingle();
}
int main() {thread t[110];for (int i = 1; i <= 10; i++) {t[i] = thread(func);}for (int i = 1; i <= 10; i++)t[i].join();return 0;
}

工厂模式:

#include <iostream>
#include <cassert>
#include <atomic>
#include <vector>
#include <thread>
#include <sstream>
#include <mutex>
using namespace std;
// 抽象类 和 抽象工厂
class Fruit {
public:virtual void sayname() = 0;
};
class FruitFactory {
public:virtual Fruit* getFruit() = 0;
};
class Apple : public Fruit {
public:virtual void sayname() {cout << "Apple" << endl;}
};
class Banana : public Fruit {virtual void sayname() {cout << "Banana" << endl;}
};
class AppleFactory : public FruitFactory {
public:virtual Fruit* getFruit() {return new Apple();}
};
class BananaFactory : public FruitFactory {
public:virtual Banana* getFruit() {return new Banana();}
};
int main() {Fruit* F = NULL;FruitFactory* FF = new AppleFactory();F = FF->getFruit();F->sayname();FF = new BananaFactory();F = FF->getFruit();F->sayname();return 0;
}

抽象工厂:

#include <iostream>
#include <cassert>
#include <atomic>
#include <vector>
#include <thread>
#include <sstream>
#include <mutex>
using namespace std;
// 抽象类 和 抽象工厂
class Fruit {
public:virtual void sayname() = 0;virtual ~Fruit() {}
};
// 获得一个产品族
class FruitFactory {
public:virtual Fruit* getApple() = 0;virtual Fruit* getBanana() = 0;virtual ~FruitFactory() {};
};
class NorthApple : public Fruit {
public:virtual void sayname() {cout << "NorthApple" << endl;}
};
class NorthBanana : public Fruit {
public:virtual void sayname() {cout << "NorthBanana" << endl;}
};class NorthFruitFactory : public FruitFactory {
public:virtual Fruit* getApple() {return new NorthApple();}virtual Fruit* getBanana() {return new NorthBanana();}
};class SouthApple : public Fruit {
public:virtual void sayname() {cout << "SouthApple" << endl;}
};
class SouthBanana : public Fruit {
public:virtual void sayname() {cout << "SouthBanana" << endl;}
};class SouthFruitFactory : public FruitFactory {
public:virtual Fruit* getApple() {return new SouthApple();}virtual Fruit* getBanana() {return new SouthBanana();}
};
int main() {Fruit* F = NULL;FruitFactory* FF = new NorthFruitFactory();F = FF->getApple();F->sayname();F = FF->getBanana();F->sayname();FF = new SouthFruitFactory();F = FF->getApple();F->sayname();F = FF->getBanana();F->sayname();return 0;
}

 

相关文章:

LRU算法

#include <iostream> #include <list> #include <map> using namespace std; class LRU {struct node {int key, val;node(int k_ 0, int v_ 0) {key k_;val v_;}};public:int cap; // 大小map<int, list<node>::iterator> mp;list<node&…...

数据库事务四个特性

ACID特性 数据库管理系统中事务(transaction)的四个特性&#xff08;分析时根据首字母缩写依次解释&#xff09;&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&#xf…...

Git入门简介

本文简单介绍一下Git的使用&#xff0c;主要内容有下&#xff1a; Git基本介绍Git相较于SVN的优势Git使用流程及常用命令 Git基本介绍 Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目 —— [ 百度百科 ] GitHub&#xff1a;https…...

《移动App测试实战》读书笔记

总的来讲&#xff0c;这本书基本涵盖了移动App测试的方方面面&#xff0c;并结合各个专题做了简单讲解&#xff0c;对于扩展无线端测试的知识面有极大的好处&#xff0c;缺点是知识点点到为止&#xff0c;毕竟全书300多页的篇幅也不可能对知识点进行专题讲解。书中作者提到的一…...

http load介绍

前几天工作中要对项目的接口做简单压测&#xff0c;就使用了http load做了简单测试&#xff0c;下面介绍一下这款工具的使用说明。简介&#xff1a;http_load是基于linux平台的性能测试工具&#xff0c;它体积非常小&#xff0c;仅100KB。它以并行复用的方式运行&#xff0c;可…...

工具介绍:ITerm 2

今天介绍一款终端工具ITerm2&#xff0c;有了它&#xff0c;大大提供了我们的工作效率&#xff1b;官方地址&#xff1a;http://www.iterm2.com/ 颜控首选&#xff0c;不多说&#xff0c;上图&#xff1a; bg图片、字体、颜色等都可以在Preferences里设置&#xff0c;强大&…...

shell编写图片抓取器

最近在看《Linux Shell脚本攻略》一书&#xff0c;书中有个图片抓取器的script&#xff0c;抓取出来记录一下。适用范围&#xff1a;适合抓取html里符合img标签正则规则的图片。 #!/bin/bash if [ $# -ne 3 ] thenecho "Usage: $0 URL -d DIRECTORY"exit -1 fi for …...

SSH免密码登录

公司服务器很多的话&#xff0c;如果每次连接都需要输入密码&#xff0c;那就太麻烦了。So&#xff0c;免密登录就可以大大提高我们的工作效率了。 下面介绍ssh免密登录的方法&#xff1a; 实现步骤&#xff1a; 1.在你的自己的机器下面使用ssh-keygen命令来实现创建公钥 使…...

Jmeter访问HTTPS请求

公司最近在搞全站HTTPS改造&#xff0c;进一步提高网站的安全性&#xff0c;防止运营商劫持。那么&#xff0c;改造完成后&#xff0c;所有前后端的URL将全部为https。 So &#xff0c;研究下怎么用Jmeter访问https请求呢。 其实很简单&#xff0c; 第一步在jmeter中创建HTT…...

《Maven实战》读书笔记

之前对Maven有些认识&#xff0c;通过这本书《Maven实战》一起系统的回顾一下&#xff0c;总结的东西不会很全面&#xff0c;但都是日常工作中最常用的。 简介&#xff1a; maven翻译为“知识的积累”&#xff0c;基于项目对象模型&#xff08;Project Object Model&#xff0…...

github/gitlab 管理多个ssh key

以前只使用一个 ssh key 在github上提交代码&#xff0c;由于工作原因&#xff0c;需要再添加一个ssh key在公司的 gitlab上提交代码&#xff0c;下面记录下配置过程&#xff0c;防止遗忘。 生成并添加第一个ssh key 第一次使用ssh生成key&#xff0c;默认会在用户~&#xff…...

解决部分国产机连不上adb shell的办法

手里头认领了公司的部分测试机&#xff0c;但是工作中发现部分手机连上usb后&#xff0c;adb devices识别不出设备。下面总结一下解决办法&#xff1a; 魅蓝Note2&#xff1a; 1.在命令行输入 system_profiler SPUSBDataType,查看连接的usb设备的信息&#xff0c;如下图&…...

流式断言器AssertJ入门介绍

之前一直使用Junit自带的Assert类进行断言&#xff0c;尽管这能满足一些我们最基础的需要&#xff0c;但从功能上来讲还是不够强大的。 今天介绍一款功能强大的流式断言器AssertJ&#xff0c;所谓的流式断言就是相较于Assert的单个校验点断言&#xff0c;支持一条断言语句对实…...

单元测试框架-Junit介绍

在工作中编写接口脚本中经常用到junit作为测试框架&#xff0c;下面总结一下junit的用法和编写规范&#xff0c;供大家参考。 junit简介&#xff1a; 基于Java语言的单元测试框架&#xff0c;在日常工作中被广泛运用于单元测试和接口测试。 junit官网&#xff1a;http://jun…...

TestNG使用总结

TestNG简介&#xff1a; TestNG是一个测试框架&#xff0c;其灵感来自JUnit和NUnit&#xff0c;但同时引入了一些新的功能&#xff0c;使其功能更强大&#xff0c;使用更方便。 TestNG相较于Junit的优点&#xff1a; 可指定执行顺序&#xff0c; dependsOnMethods 属性来应对…...

基于数据驱动的接口自动化测试解决方案

总结一下我么项目中使用的基于数据驱动的接口自动化测试解决方案&#xff0c;仅供大家参考。1.接口框架设计结构 2.接口测试脚本设计原则 3.持续集成 这块用jenkins就可以了&#xff0c;就不介绍了&#xff0c;目前我们项目的集成规则介绍一下&#xff1a; 1.脚本job与应用对…...

python数据类型

重温python数据类型&#xff0c;重点掌握str&#xff0c;list&#xff0c;tuple及dict类型。...

Python高级特性

Python高级特性 切片迭代及迭代器列表生成式生成器 这些高级特性的作用都是一样的&#xff0c;为了代码的简洁、高效运行。 切片 切片让取一个list或tuple的部分元素变得相当简单&#xff0c; e.g: L[‘jack’,’mike’,’jerry’] 那么第一个位置&#xff0c;索引为0&a…...

ADB学习笔记

简介&#xff1a; ADB的全称为Android Debug Bridge&#xff08;调试桥&#xff09;&#xff0c; 它是一个客户端-服务器端程序&#xff0c;其中客户端是你用来操作的电脑, 服务器端是android设备。作用显而易见&#xff0c;能方便我们在PC上对手机进行调试的一些工作。 原理…...

Appium简介

Appium简介 Appium is an open source, cross-platform test automation tool for native, hybrid and mobile web apps, tested on simulators (iOS), emulators (Android), and real devices (iOS, Android, Windows). 优缺点 优点显而易见&#xff0c;支持webview、hybri…...

Appium-java API详解

目前appium-java最新版本是5.0.0-BETA3&#xff0c;因此就拿最新的说明&#xff0c;以Java为例&#xff0c;首先引入java client的依赖&#xff1a;<dependency><groupId>io.appium</groupId><artifactId>java-client</artifactId><version&g…...

Appium学习遇到的坑

安装篇 Q1&#xff1a;安装时要求java运行环境为最低1.8&#xff0c;我原先的jdk1.7无法运行。 A1&#xff1a;升级jdk后解决。附appium安装教程 配置篇 Q2&#xff1a;运行提示error&#xff1a;Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND lo…...

每天一个adb命令:pm 命令详解

介绍adb shell中一个很重要的命令——pm&#xff08;Package Manager&#xff09;&#xff0c;这个命令主要用于获取和安装在 Android 设备上的应用信息。 关于pm命令的用法解析。命令行下输入adb shell pm即可获得关于pm的用法帮助&#xff0c;如下所示&#xff1a; usage: …...

每天一个adb命令:am 命令详解

am 这个命令可以帮助我们直接启动activity、service及广播。 adb shell am 可以查看命令的详细说明。 usage: am [subcommand] [options] usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>][--sampling INTERVAL] [-R COUNT] [-S] [--opengl-tra…...

每天一个adb命令:input 命令详解

input命令可以用于向键盘发送一些指令&#xff0c;先看看input的官方说明&#xff1a; Usage: input [<source>] <command> [<arg>...]The sources are:mousekeyboardjoysticktouchnavigationtouchpadtrackballstylusdpadtouchscreengamepadThe commands an…...

每天一个adb命令:screen 命令详解

screen命令分为截屏screencap命令及录制视频screenrecord命令。 screencap命令&#xff1a; sage: screencap [-hp] [-d display-id] [FILENAME]-h: this message-p: save the file as a png.-d: specify the display id to capture, default 0. If FILENAME ends with .png …...

每天一个adb命令:wm命令详解

wm命令可以用于获取屏幕分辨率、像素密度等。 前提&#xff1a;Android4.3及以上 usage: wm [subcommand] [options]wm size [reset|WxH]wm density [reset|DENSITY]wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]wm size: return or override display size.wm density: overrid…...

每天一个adb命令:dumpsys命令详解

dumpsys是一个能帮助我们对手机进行性能分析的命令&#xff0c;它可以帮助我们获取电池、内存、cpu、磁盘、wifi等等信息&#xff0c;具体能查询的信息可以通过命令&#xff1a; adb shell dumpsys | grep DUMP OF SERVICE DUMP OF SERVICE DockObserver: DUMP OF SERVICE Sm…...

每天一个adb命令:monkey命令详解

国际惯例&#xff0c;先用adb shell monkey 看看具体用法。 具体用法 usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...][-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...][--ignore-crashes] [--ignore-timeouts][--ignore-security-exceptions][--monitor-native-cra…...

JSON相关知识点

JSON是工作中经常会遇到的一种数据结构&#xff0c;下面来讲讲与他相关的一些知识点。 JSON简介&#xff1a; JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法,类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易解析。 JSONObj…...

markdown编写入门

什么是markdown&#xff1f; Markdown 是一种轻量级的「标记语言」&#xff0c;通过简单的标记符号来格式化排版&#xff0c;是文本展现的更加优美&#xff0c;形象。 markdown优点&#xff1a; 1.不像office&#xff0c;存在版本兼容问题&#xff0c;markdown无此问题&#…...

log4j学习demo

log4j简介 Log4j是Apache的一个开放源代码项目&#xff0c;是项目中比较常用的日志记录组件。 引入log4j <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency> log4…...

idea常用技巧收集

idea相比eclipse的优点我在这里就不赘述了&#xff0c;更多参考&#xff1a;idea官网,本文重点讲下自己在idea使用过程中常用的一些技巧&#xff0c;以后随时更新…… 主要分成三大块&#xff1a; 1. 系统设置 2. 快捷键 3. 其他设置 系统设置 主题风格设置&#xff1a;默…...

浅谈spring

这个话题感觉是老生常谈了&#xff0c;但是作为基础&#xff0c;我还是要沉淀一下&#xff0c;深刻认识。 spring核心思想 简洁的讲spring的核心思想就是两个特性&#xff1a;控制反转(IOC)和面向切面(AOP) 。 但是这两个概念却不太容易理解&#xff0c;我一开始也不太理解&…...

spring装配bean

最近在看《spring实战》一书&#xff0c;记录下spring装配bean这一章中自己学到的一些知识点。下面简单说明下bean和装配这两个概念的意思。 bean&#xff1a;在spring中代表组件&#xff0c;通过bean将不同的组件联系在一起。装配&#xff1a;是指创建应用对象之间协作关系的行…...

初识spring RestTemplate

《spring实战》读书笔记之初识spring RestTemplate。首先需要先了解下什么是REST。 REST&#xff1a;官方解释&#xff0c;表述性状态转移。 感觉还是不知所云&#xff0c;参考下怎样用通俗的语言解释REST&#xff0c;以及RESTful&#xff1f; 即URL定位资源&#xff0c;用H…...

记一次爬虫实践(一):思路及模拟登录

需求背景 因为我们的应用通常运行在h5上&#xff0c;因此图片格式选择了加载较快的webp格式&#xff0c;但是运营提起有在pc上批量下载图片&#xff08;要求图片格式&#xff09;的需求&#xff0c;目前比较麻烦&#xff0c;需要登录h5-找到接口中对应图片资源-一张张另存为到…...

记一次爬虫实践(二):下载图片及打包

登录之后&#xff0c;我们开始下载图片。 这里把完整程序po一下。 程序中用到的框架是flask&#xff0c;参考Flask文档 # encodingUTF-8 import zipfileimport flask import requests import os import urllib2 import time from flask import Flask, jsonifyapp Flask(__n…...

spring boot入门学习

spring boot 入门基础前言什么是spring boot&#xff1f;为什么要用spring boot&#xff1f;spring boot的常用注释有哪些&#xff1f;Controller层RequestMapping详解配置相关自动配置一个简单的demo实践idea如何新建spring boot项目&#xff1f;前言 微服务这个概念最近比较…...

常用HTML标签简介

HTML&#xff1a;超文本标记语言 这个没啥技术含量&#xff0c;这里只是简单介绍&#xff0c;主要是要熟能生巧。 布局相关&#xff1a; <!-- 标记导航 --><nav></nav> <!-- 标记侧边栏 --><aside></aside> <!-- 标记正文 --><…...

idea插件开发入门

前言&#xff1a;最近想研究一款自动在idea中定位缺陷及发送JIRA的快捷工具&#xff0c;方便提升报自动化脚本的bug的效率。因为idea插件学习是必不可少了&#xff0c;沉淀小结如下。 idea插件开发入门插件用途工程创建配置文件Action实现开发语法常用对象常用方法运行效果打包…...

spring boot深入及启动原理探究

围绕spring boot 的优点&#xff0c;本文我们来探究一下spring boot具体是如何实现这些特性的。 自动配置&#xff1a;针对很多Spring应用程序和常见的应用功能&#xff0c;Spring boot能自动提供相关配置&#xff1b;起步依赖&#xff1a;告诉Spring boot需要什么功能,它就能引…...

接口测试那些事儿

什么是接口&#xff1f; 首先&#xff0c;在讲接口测试之前&#xff0c;我们先要搞清楚接口类型的概念。 接口&#xff1a;可能是系统与系统&#xff08;包括服务与服务&#xff09;之间的调用&#xff0c;像A系统&#xff08;服务&#xff09;给B系统&#xff08;服务&#x…...

myeclipse的一些使用技巧

一直都是看别人的博客&#xff0c;学习别人的心得&#xff0c; 但是软件行业涉及的技术太多&#xff0c;学过的很多东西都忘了&#xff0c;今天我也弄个博客玩玩&#xff0c; 把我所学的&#xff0c;工作中遇到的问题也做做记录&#xff0c;方便自己&#xff0c;也方便他人&…...

mysql重置Root密码

方法一: 在my.ini的[mysqld]字段加入&#xff1a; skip-grant-tables 重启mysql服务&#xff0c;这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 user set passwordpassword(新密码) WHERE Userroot; mysql>flush privileges; 运…...

JfreeChart柱状图饼图

JfreeChart画出柱状图饼图的代码片段及详细的注释&#xff0c;附件为JfreeChart中文API一览表&#xff0c;和生成的柱状图&#xff0c;饼图图片 import java.awt.Font; import java.io.FileOutputStream; import java.io.IOException; import org.jfree.chart.C…...

自动装配的底层实现

public void autowire(Object o, Map<String, String> map) throws Exception { // 获得map 所有key Set<String> keys map.keySet(); // 获得Object中所有属性 // 获得Class对象 Class c o.getClass(); // 获得…...

java基础需要强化之关键

多线程 进程和线程的区别 ProccessBuilder 和 Runtime.getRuntime().exec java中两种线程的创建方式 extends Thread和 implements Runnable 线程的生命周期&#xff1a;线程创建、Runnable、Running、Blocked、dead sleep、yield、join 等方法 线程打断 interrupt 什么是守护线…...

MD5加密算法详解

注&#xff1a;MD5不是绝对的安全&#xff0c;有俩md5解决 /******************************************************************************* * keyBean 类实现了RSA Data Security, Inc.在提交给IETF 的RFC1321中的keyBean message-digest * 算法。 *****************…...

javaSE之反射

什么是反射&#xff1f; 简单的说&#xff1a;剖析java类中的各个组成部分&#xff0c;映射成一个个java对象。 在java.lang.reflect中。 反射用在哪&#xff1f; 多用于框架和组件&#xff0c;利用反射技术写出复用性高的通用程序 我只列出了反射中几个常用的API 类 Class 构…...