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

23种设计模式-7种结构模式

结构型模式简述

把类或对象结合在一起形成一个更大的结构。

装饰器模式:动态的给对象添加新的功能。

代理模式:为其它对象提供一个代理以便控制这个对象的访问。

桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。

适配器模式:将一个类的方法接口转换成客户希望的另一个接口。

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。

外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。

享元模式:通过共享技术来有效的支持大量细粒度的对象。

模式C++代码实现

桥接模式

桥接模式(Bridge Pattern)是一种结构性设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。桥接模式通过将多维度的类层次结构分为两个独立的继承层次结构,从而提高了系统的可扩展性和灵活性。

以下是一个使用C++实现桥接模式的简单示例,假设我们要实现不同类型的电视和遥控器的桥接模式:

#include <iostream>// 实现部分
class TV {
public:virtual void turnOn() = 0;virtual void turnOff() = 0;
};class SonyTV : public TV {
public:void turnOn() override {std::cout << "Sony TV is turned on" << std::endl;}void turnOff() override {std::cout << "Sony TV is turned off" << std::endl;}
};class LGTV : public TV {
public:void turnOn() override {std::cout << "LG TV is turned on" << std::endl;}void turnOff() override {std::cout << "LG TV is turned off" << std::endl;}
};// 抽象部分
class RemoteControl {
protected:TV* tv;public:RemoteControl(TV* tv) : tv(tv) {}virtual void turnOn() {tv->turnOn();}virtual void turnOff() {tv->turnOff();}
};class BasicRemoteControl : public RemoteControl {
public:BasicRemoteControl(TV* tv) : RemoteControl(tv) {}void turnOn() override {std::cout << "Basic Remote: ";RemoteControl::turnOn();}void turnOff() override {std::cout << "Basic Remote: ";RemoteControl::turnOff();}
};class AdvancedRemoteControl : public RemoteControl {
public:AdvancedRemoteControl(TV* tv) : RemoteControl(tv) {}void mute() {std::cout << "Advanced Remote: Muted" << std::endl;}
};int main() {TV* sonyTV = new SonyTV();TV* lgTV = new LGTV();RemoteControl* basicRemoteSony = new BasicRemoteControl(sonyTV);RemoteControl* advancedRemoteLG = new AdvancedRemoteControl(lgTV);basicRemoteSony->turnOn();basicRemoteSony->turnOff();advancedRemoteLG->turnOn();advancedRemoteLG->mute();advancedRemoteLG->turnOff();delete sonyTV;delete lgTV;delete basicRemoteSony;delete advancedRemoteLG;return 0;
}

在这个示例中,TV 类表示实现部分,SonyTVLGTV 是其具体实现。RemoteControl 类表示抽象部分,BasicRemoteControlAdvancedRemoteControl 是其具体实现。通过使用桥接模式,我们可以轻松地将不同的遥控器与不同的电视组合,实现了抽象部分和实现部分的解耦。

装饰模式

装饰模式(Decorator Pattern)是一种结构性设计模式,允许在不改变已有对象的结构的情况下,动态地将功能添加到对象上。在装饰模式中,通过创建装饰器类,将装饰器类与被装饰的类组合,从而实现功能的叠加和扩展。

以下是一个使用C++实现装饰模式的简单示例,假设我们要实现不同类型的咖啡以及可以添加调料的功能:

#include <iostream>
#include <string>// 基础咖啡类(被装饰的类)
class Coffee {
public:virtual std::string getDescription() const {return "Basic Coffee";}virtual double cost() const {return 1.0;}
};// 调料装饰器类
class CoffeeDecorator : public Coffee {
protected:Coffee* coffee;public:CoffeeDecorator(Coffee* coffee) : coffee(coffee) {}std::string getDescription() const override {return coffee->getDescription();}double cost() const override {return coffee->cost();}
};// 具体的调料装饰器类
class MilkDecorator : public CoffeeDecorator {
public:MilkDecorator(Coffee* coffee) : CoffeeDecorator(coffee) {}std::string getDescription() const override {return coffee->getDescription() + ", Milk";}double cost() const override {return coffee->cost() + 0.5;}
};class SugarDecorator : public CoffeeDecorator {
public:SugarDecorator(Coffee* coffee) : CoffeeDecorator(coffee) {}std::string getDescription() const override {return coffee->getDescription() + ", Sugar";}double cost() const override {return coffee->cost() + 0.2;}
};int main() {Coffee* basicCoffee = new Coffee();Coffee* milkCoffee = new MilkDecorator(basicCoffee);Coffee* milkSugarCoffee = new SugarDecorator(milkCoffee);std::cout << "Description: " << milkSugarCoffee->getDescription() << std::endl;std::cout << "Cost: $" << milkSugarCoffee->cost() << std::endl;delete basicCoffee;delete milkCoffee;delete milkSugarCoffee;return 0;
}

在这个示例中,Coffee 类表示被装饰的基础咖啡,CoffeeDecorator 类表示调料装饰器。具体的调料装饰器类如 MilkDecoratorSugarDecorator 继承自 CoffeeDecorator,并通过重写 getDescriptioncost 方法来添加调料的描述和价格。通过组合不同的装饰器,我们可以在运行时动态地为咖啡添加不同的调料。

适配器模式

适配器模式(Adapter Pattern)是一种结构性设计模式,它允许将不兼容的接口转换成客户端期望的接口。适配器模式通常用于连接两个不兼容的接口,使它们可以一起工作。

以下是一个使用C++实现适配器模式的简单示例,假设我们有一个已有的音频播放器接口和一个新的MP3播放器类,我们需要将MP3播放器接口适配成音频播放器接口。

#include <iostream>
#include <string>// 旧的音频播放器接口
class AudioPlayer {
public:virtual void playAudio(const std::string& audioType, const std::string& fileName) = 0;
};// 新的MP3播放器类
class Mp3Player {
public:void playMp3(const std::string& fileName) {std::cout << "Playing MP3 file: " << fileName << std::endl;}
};// 适配器类,将Mp3Player适配成AudioPlayer接口
class Mp3Adapter : public AudioPlayer {
private:Mp3Player mp3Player;public:void playAudio(const std::string& audioType, const std::string& fileName) override {if (audioType == "mp3") {mp3Player.playMp3(fileName);}}
};int main() {AudioPlayer* audioPlayer = new Mp3Adapter();audioPlayer->playAudio("mp3", "song.mp3");audioPlayer->playAudio("wma", "song.wma"); // 这不会播放,因为适配器只支持MP3delete audioPlayer;return 0;
}

在这个示例中,AudioPlayer 是旧的音频播放器接口,Mp3Player 是新的MP3播放器类,Mp3Adapter 是适配器类,它继承自 AudioPlayer 并包含一个 Mp3Player 对象。适配器类的 playAudio 方法将传入的 audioType 参数与适配的格式进行比较,如果是 “mp3” 格式,就调用 Mp3Player 的方法来播放。

通过适配器模式,我们可以在不改变已有代码的情况下,将不兼容的MP3播放器接口适配成了音频播放器接口,从而让它们可以一起工作。

外观模式

外观模式(Facade Pattern)是一种结构性设计模式,它为复杂的子系统提供一个统一的接口,使得外部客户端可以更简单地使用该子系统,而不需要了解其内部的复杂逻辑。

以下是一个使用C++实现外观模式的简单示例,假设我们有一个复杂的电子设备系统,包括电视、音响和灯光等组件,我们可以使用外观模式来创建一个统一的接口以简化客户端的操作。

#include <iostream>// 子系统:电视
class TV {
public:void turnOn() {std::cout << "TV is on" << std::endl;}void turnOff() {std::cout << "TV is off" << std::endl;}
};// 子系统:音响
class Stereo {
public:void turnOn() {std::cout << "Stereo is on" << std::endl;}void turnOff() {std::cout << "Stereo is off" << std::endl;}
};// 子系统:灯光
class Lights {
public:void turnOn() {std::cout << "Lights are on" << std::endl;}void turnOff() {std::cout << "Lights are off" << std::endl;}
};// 外观类:家庭影院
class HomeTheaterFacade {
private:TV tv;Stereo stereo;Lights lights;public:void watchMovie() {std::cout << "Get ready to watch a movie!" << std::endl;tv.turnOn();stereo.turnOn();lights.turnOff();}void endMovie() {std::cout << "Movie is over, shutting down..." << std::endl;tv.turnOff();stereo.turnOff();lights.turnOn();}
};int main() {HomeTheaterFacade homeTheater;homeTheater.watchMovie();std::cout << "----------------------" << std::endl;homeTheater.endMovie();return 0;
}

在这个示例中,TVStereoLights 分别表示不同的电子设备子系统。HomeTheaterFacade 是外观类,它封装了对各个子系统的操作,提供了 watchMovieendMovie 方法来统一操作电视、音响和灯光等组件,从而让客户端更简单地操作整个家庭影院。

通过外观模式,我们将复杂的子系统封装成一个简单的接口,使得客户端不需要了解子系统的复杂性,只需通过外观类来操作整个系统。

组合模式

组合模式(Composite Pattern)是一种结构性设计模式,它允许将对象组合成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以统一处理单个对象和对象组合,而不需要区分它们的具体类型。

以下是一个使用C++实现组合模式的简单示例,假设我们要创建一个文件系统的层次结构,包括文件和文件夹。文件夹可以包含文件和其他文件夹,形成一个树形结构。

#include <iostream>
#include <vector>// 组件抽象基类
class FileSystemComponent {
public:virtual void display() const = 0;
};// 文件类
class File : public FileSystemComponent {
private:std::string name;public:File(const std::string& n) : name(n) {}void display() const override {std::cout << "File: " << name << std::endl;}
};// 文件夹类
class Folder : public FileSystemComponent {
private:std::string name;std::vector<FileSystemComponent*> components;public:Folder(const std::string& n) : name(n) {}void addComponent(FileSystemComponent* component) {components.push_back(component);}void display() const override {std::cout << "Folder: " << name << std::endl;for (const auto& component : components) {component->display();}}
};int main() {File file1("file1.txt");File file2("file2.txt");File file3("file3.txt");Folder folder1("folder1");folder1.addComponent(&file1);folder1.addComponent(&file2);Folder folder2("folder2");folder2.addComponent(&file3);Folder root("root");root.addComponent(&folder1);root.addComponent(&folder2);root.display();return 0;
}

在这个示例中,FileSystemComponent 是组件的抽象基类,包括了 FileFolder 类。File 表示文件,Folder 表示文件夹,文件夹可以包含文件和其他文件夹。通过使用组合模式,我们可以将文件和文件夹组合成一个层次结构,使得客户端可以统一地处理不同层次的组件。

通过组合模式,我们可以轻松地创建复杂的层次结构,同时可以使用统一的接口来操作整个结构。这种模式在处理递归结构时特别有用,例如文件系统、组织架构等。

代理模式

代理模式(Proxy Pattern)是一种结构性设计模式,它提供了一个代理对象,用于控制对原始对象的访问。代理对象可以作为原始对象的替代,用于控制、管理或增强原始对象的访问。

以下是一个使用C++实现代理模式的简单示例,假设我们有一个图片加载器,可以从磁盘加载图片并显示。我们可以使用代理模式创建一个代理图片加载器,用于控制图片的加载和显示。

#include <iostream>
#include <string>// 抽象主题
class Image {
public:virtual void display() = 0;
};// 真实主题
class RealImage : public Image {
private:std::string filename;public:RealImage(const std::string& file) : filename(file) {loadFromDisk();}void display() override {std::cout << "Displaying image: " << filename << std::endl;}void loadFromDisk() {std::cout << "Loading image: " << filename << std::endl;}
};// 代理类
class ProxyImage : public Image {
private:RealImage* realImage;std::string filename;public:ProxyImage(const std::string& file) : filename(file), realImage(nullptr) {}void display() override {if (realImage == nullptr) {realImage = new RealImage(filename);}realImage->display();}
};int main() {Image* image = new ProxyImage("image.jpg");// 图片未加载,调用display会加载并显示image->display();// 图片已加载,直接显示image->display();return 0;
}

在这个示例中,Image 是抽象主题接口,定义了图片的显示方法。RealImage 是真实主题类,实现了图片加载和显示的功能。ProxyImage 是代理类,持有一个真实主题的实例,在需要时创建并控制真实主题的访问。

通过代理模式,我们可以延迟真实主题的创建和加载,只有在需要时才会真正地创建和加载对象。代理可以用于实现懒加载、权限控制、缓存等功能,从而对原始对象的访问进行了增强或控制。

享元模式

享元模式(Flyweight Pattern)是一种结构性设计模式,旨在通过共享对象来最大程度地减少内存使用和对象创建的开销。它适用于存在大量相似对象的场景,通过共享这些相似部分,可以有效减少内存占用。

以下是一个使用C++实现享元模式的简单示例,假设我们要创建一个文字编辑器,需要创建大量的字符对象。我们可以使用享元模式来共享相同字符的实例,以减少内存使用。

#include <iostream>
#include <unordered_map>// 字符类,享元类
class Character {
private:char symbol;public:Character(char c) : symbol(c) {}char getSymbol() const {return symbol;}void display(int pointSize) {std::cout << "Character: " << symbol << " Point size: " << pointSize << std::endl;}
};// 字符工厂,负责创建和管理字符实例
class CharacterFactory {
private:std::unordered_map<char, Character*> characters;public:Character* getCharacter(char c) {if (characters.find(c) == characters.end()) {characters[c] = new Character(c);}return characters[c];}
};int main() {CharacterFactory characterFactory;// 创建并显示字符实例Character* c1 = characterFactory.getCharacter('A');c1->display(12);Character* c2 = characterFactory.getCharacter('B');c2->display(16);// 再次获取相同字符实例Character* c3 = characterFactory.getCharacter('A');c3->display(20);// 释放资源delete c1;delete c2;return 0;
}

在这个示例中,Character 是享元类,表示一个字符对象。CharacterFactory 是字符工厂类,负责创建和管理字符实例。通过使用享元模式,我们可以共享相同字符的实例,从而减少了内存的使用。

享元模式的关键是将对象的共享和非共享状态分离,共享状态可以被多个对象共享,非共享状态可以通过参数传递给对象。这样可以在一定程度上减少对象的创建和内存占用。

相关文章:

23种设计模式-7种结构模式

结构型模式简述 把类或对象结合在一起形成一个更大的结构。 装饰器模式&#xff1a;动态的给对象添加新的功能。 代理模式&#xff1a;为其它对象提供一个代理以便控制这个对象的访问。 桥接模式&#xff1a;将抽象部分和它的实现部分分离&#xff0c;使它们都可以独立的变…...

大数据Flink(六十七):SQL Table 简介及运行环境

文章目录 SQL & Table 简介及运行环境 一、​​​​​​​​​​​​​​简介 二、案例...

WPF使用依赖注入

现在依赖注入在.Net里面已经普及&#xff0c;自己常写一些简单的demo倒是无所谓&#xff0c;但偶尔写一点正式的工程&#xff0c;也免不了要使用一下&#xff0c;于是总结了一下在WPF里面使用依赖注入。 在写简单Demo时候&#xff0c;通常是在MainWindow的构造函数里面直接做初…...

玩转科技|了解AI平台桌面客户端—ChatBox

目录 前言 特性 ​编辑 为什么需要 ChatBox&#xff1f; ChatGPT Plus 平替&#xff1f; 下载 支持系统 功能图 使用教程 ​感受 展示 前言 今天小编又来了&#xff0c;推荐给大家一款开源的OpenAI API桌面客户端ChatBox&#xff0c;它支持 Windows、Mac 和 Linux。…...

visual studio 2022.NET Core 3.1 未显示在目标框架下拉列表中

问题描述 在Visual Studio 2022我已经安装了 .NET core 3.1 并验证可以运行 .NET core 3.1 应用程序&#xff0c;但当创建一个新项目时&#xff0c;目标框架的下拉列表只允许 .NET 6.0和7.0。而我在之前用的 Visual Studio 2019&#xff0c;可以正确地添加 .NET 核心项目。 …...

人工智能项目集合推荐(数据集 模型训练 C++和Android部署)

人工智能项目集合推荐(数据集 模型训练 C和Android部署) 目录 人工智能项目集合推荐(数据集 模型训练 C和Android部署) 1.三维重建项目集合 ★双目三维重建 ★结构光三维重建 2.AI CV项目集合 ★人脸检测和人体检测 ★人体姿态估计(人体关键点检测) ★头部朝向估计 …...

C# 服务HTTPS 对 请求被中止: 未能创建 SSL/TLS 安全通道报错

1.如果windows支持HTTPS的TLS协议&#xff0c;则可以直接跳过 &#xff08;Tls12&#xff09; [WebMethod(Description "获取HttpsPost加密服务.")] public string HTTPSPOST(String input,String sUrl) { Log.Add("ReceiveNotice", &qu…...

二级MySQL(七)——表格数据修改

1、修改表格中部分数据 将表格某一行的数据修改&#xff0c;这里用的UPDATE语句&#xff1a; UPDATE tb_student SET studentName 黄涛,native湖北,nation汉 WHERE studentNo 2014210103; 结果&#xff1a; 2、修改表格某一列全部数据 比如性别全部设置为‘女’ UPDATE…...

【日常积累】Linux下sftp搭建

概述 SFTP是Secure File Transfer Protocol的缩写&#xff0c;是安全文件传送协议。可以为传输文件提供一种安全的加密方法。跟ftp几乎语法功能一样。 SFTP是SSH的一部分&#xff0c;是一种传输档案至Blogger伺服器的安全方式。它本身没有单独的守护进程&#xff0c;必须使用s…...

【深入浅出C#】章节 9: C#高级主题:多线程编程和并发处理

多线程编程和并发处理的重要性和背景 在计算机科学领域&#xff0c;多线程编程和并发处理是一种关键技术&#xff0c;旨在充分利用现代计算机系统中的多核处理器和多任务能力。随着计算机硬件的发展&#xff0c;单一的中央处理单元&#xff08;CPU&#xff09;已经不再是主流&a…...

Windows Server服务器安全加固基线配置

一、账户管理、认证授权 一、账户 1、管理缺省账户 安全基线项说明&#xff1a;对于管理员账号&#xff0c;要求更改缺省账户名称&#xff1b;禁用Guest(来宾)账户。 操作步骤&#xff1a;进入控制面板-->管理工具-->计算机管理&#xff0c;在系统工具-->本地用户和组…...

基于NXP i.MX 6ULL核心板的物联网模块开发案例(4)

目录 5 4G模块测试 5.1 网络功能测试 5.2 短信功能测试 5.3 通话功能测试 5.4 GPS定位功能测试 5.5 程序编译 前言 本文主要介绍基于创龙科技TLIMX6U-EVM评估板的物联网模块开发案例,适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.…...

英语——强调

强调句是英语中常用的一个重点句型,其基本结构是:It+be+被强调部分+that+句子其余部分。 第一节 强调句的基本用法 一、被强调的句子成分 在强调句型中,能够被强调的句子成分通常为主语、宾语、状语等,不能用来强调谓语动词、表语、补语、让步状语、条件状语等。当被强调…...

全流程R语言Meta分析核心技术教程

详情点击链接&#xff1a;全流程R语言Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文…...

【C++精华铺】9.STL string

目录 1. string类的优势 2. string类的常用接口 2.1 常用构造 1. 空串构造&#xff1a;string(); 2. C串构造&#xff1a;string(const char* s); 3. 拷贝构造&#xff1a;string(const string& str); 4. 字符填充构造&#xff1a;string(size_t n, char c); 5. 迭代…...

【PACS】医学影像管理系统源码带三维重建后处理技术

PACS系统&#xff0c;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c;CT&#xff0c;超声&#xff0c;各种X光机&#xff0c;各种红外仪、显微仪等设备产生的图像&#xff09;通过各…...

从0开始学go 第一天

今天是开始学go的第x天&#xff0c;前些日子看了看语言&#xff0c;今天找一个web开发来跟着学&#xff0c;记录一下遇到的问题&#xff0c;方便以后复习查阅。 视频看的是https://www.bilibili.com/video/BV1gJ411p7xC?p3&vd_sourceab5bdbd04f4142027c66d604d5285204 视…...

Spring Cloud Nacos详解

目录 1、Spring Cloud Nacos详细介绍2、Spring Cloud Nacos具体案列 Spring Cloud Nacos 是一个由阿里巴巴集团开发的开源分布式系统服务发现、配置管理和服务管理的平台。Nacos 支持多种服务发现方式&#xff0c;包括 DNS 方式、HTTP 和 RPC 方式&#xff0c;同时提供了灵活的…...

2023谷歌开发者大会直播大纲「初稿」

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…...

react import 引用失效 node_modules/@types/react/index.d.ts not a module.ts

问题描述 react ts的项目&#xff0c;正常使用vs code打开&#xff0c; 先运行 npm install 安装依赖过后 结果所有的react引用依旧标红&#xff0c;如下图所示&#xff1a; 点击红线 show problem(查看问题)&#xff0c;提示node_modules/types/react/index.d.ts not a mod…...

Unity中的Unistorm3.0天气系统笔记

Unistorm是Unity中的一个天气系统&#xff0c;它功能强大&#xff0c;效果优美。本文所述UniStorm为3.0版本&#xff0c;仅用于学习之用。 一、如何设置【白天】、【黑夜】和【天气类型】&#xff1f; 在Running模式下&#xff0c;按下Esc按键&#xff0c;会【弹出】或者【隐…...

VMVareC++开发环境快速配置

OVERVIEW VMVareC开发环境快速配置ipgitvimgithubzshgcc&g&cmakesshifconfigmysqlnginxredisgdb VMVareC开发环境快速配置 VMVareC开发环境快速配置&#xff0c;为了省时间快速整理出文档方便以后快速配置&#xff0c; 按照这个流程直接可以快速得到一个舒适的C/C开发…...

数据库为什么使用B+树而不是B树做索引

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…...

java必知必会--面向对象及相关基础知识

java必知必会–面向对象及相关基础知识 一、java面向对象&#xff1a; 1、什么是面向对象以及三大特性 ①我们把数据和数据之间的相互操作关系放到一起总结为–对象。所有的操作都是基于对象来进行的。 ②面向对象的的特征&#xff1a;封装、继承、多态 ③封装&#xff1a;我…...

【推荐】Spring与Mybatis集成

目录 1.概述 2.集成 2.1代码演示&#xff1a; 3.整合 3.1概述 3.2 进行整合分页 接着上两篇&#xff0c;我已经写了Mybatis动态之灵活使用&#xff0c;mybatis的分页和特殊字符的使用方式接下来把它们集成起来&#xff0c;是如何的呢&#x1f447;&#x1f447;&#x1…...

中科驭数受邀在招商银行金融科技论坛作异构计算主题分享 解码金融科技先进算力构建之路

8月25日&#xff0c;2023招银浦江金融科技论坛正式召开。中科驭数高级副总裁张宇受邀在资管科技分论坛发表《金融行业先进异构算力底座构建之路》的主题演讲&#xff0c;与参会嘉宾分享了当前计算系统的发展趋势以及如何通过异构算力构建IT技术底座来推动金融科技的创新。 ▲ 中…...

Maven打包方式pom和jar和war的区别

Maven 项目可以使用不同的打包方式&#xff0c;如 POM、JAR 和 WAR&#xff0c;这些方式决定了项目构建后生成的产物类型和用途。下面是这些打包方式的区别&#xff1a; 1. **POM (Project Object Model)&#xff1a;** POM 打包方式实际上不会生成一个可执行的构建产物。它是…...

【51单片机】EEPROM-IIC实验(按键控制数码管)

目录 &#x1f381;I2C总线 ​编辑 &#x1f381;代码 &#x1f3f3;️‍&#x1f308;main.c &#x1f3f3;️‍&#x1f308;i2.c &#x1f386;代码分析 &#x1f381;I2C总线 I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线&#xff0c;主要用于近距…...

【java】【springboot】【idea】springboot项目pom.xml 灰色下划线

解决方案&#xff1a; 这里我们找到了原因&#xff0c;就是因为选择了Ignored Files导致pom.xml文件被设置在maven忽略文件清单中&#xff0c;所以我们将打勾的选项取消&#xff0c;点击Apply,然后点击OK...

[JavaWeb]【十四】web后端开发-MAVEN高级

目录 一、分模块设计与开发 1.1 分模块设计 1.2 分模块设计-实践​编辑 1.2.1 复制老项目改为spring-boot-management 1.2.2 新建maven模块runa-pojo 1.2.2.1 将原项目pojo复制到runa-pojo模块 1.2.2.2 runa-pojo引入新依赖 1.2.2.3 删除原项目pojo包 1.2.2.4 在spring-…...

浏览器跨域

生活中的事跟跨域有什么关系&#xff0c;那必须有。 跨域的产生是浏览器的安全机制引起的&#xff0c;只有在使用Ajax时才会发生。简单来说就是你可以通过ajax发送请求&#xff0c;但要看远程服务器脸色&#xff0c;他没授权&#xff0c;浏览器这个老六就给拦截了&#xff0c;不…...

ffmpeg windows环境MinGW+msys2编译so库

一、安装MinGW 1.1、下载MinGW 1.2、下载完成后&#xff0c;会得到一个名为 mingw-get-setup.exe 的安装包&#xff0c;双击打开它&#xff0c;可以看到如下的对话框&#xff1a; 1.3、直接点击“Install”&#xff0c;进入下面的对话框 1.4、可根据自己操作系统的实际情况&am…...

python VTK PyQt5 VTK环境搭建 创建 渲染窗口及三维模型,包含 三维模型交互;

目录 Part1. VTK 介绍 Part2. PyQt5 VTK环境搭建 安装Anaconda 自带Python Anaconda下载 安装PyQt5 安装 VTK Part3 :PyQt VTK 结合样例: Part1. VTK 介绍 VTK&#xff08;visualization toolkit&#xff09;是一个开源的免费软件系统&#xff0c;主要用于三维计算机图形…...

学习总结(二) node.js服务器如何使用net模块向硬件发送命令与接收数据?

服务器server.js: const net require("net"); //此模块用于tcp/ip通讯 当收到get请求时: server.get("/cfjcApi/v1/SkyTempHudi", (req, res) > { let client new net.Socket(); client.connect(网络模块端口, 网络模块Ip, () > { //此模块…...

rust工程

文章目录 CargomacOS配置rust环境vscode配置 目录结构Cargo.tomlcargo命令hello world 跟web交互WebAssembly 跟Android交互配置Android环境JNI例子NDK例子 Rust 是一种现代的、系统级的编程语言&#xff0c;它强调并发安全、内存安全和高性能。Rust 的设计目标是提供一种有着良…...

Java并发工具类

JDK并发包中常用并发工具类&#xff1a; CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段&#xff1b; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…...

晨控CK-GW208与三菱L系列PLC以TCP通讯手册

晨控CK-GW208是一款支持标准工业以太网协议的IO-LINK主站网关&#xff0c;方便用户快速便捷的集成到 PLC 等控制系统中。 CK-GW208主站网关集成 8 路 IO-LINK 通信端口&#xff0c;采用即插即用模式&#xff0c;无需繁琐的配置&#xff0c;减轻现场安装调试的工作量。为了满足…...

c++11 标准模板(STL)(std::basic_istringstream)(五)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…...

【案例教程】高分论文密码:大尺度空间模拟预测与数字制图

尺度空间模拟预测和数字制图技术和不确定性分析广泛应用于高分SCI论文之中&#xff0c;号称高分论文密码。大尺度模拟技术可以从不同时空尺度阐明农业生态环境领域的内在机理和时空变化规律&#xff0c;又可以为复杂的机理过程模型大尺度模拟提供技术基础。在本次培训中&#x…...

uniapp 自定义手机顶部状态栏(适配状态栏高度)

开启页面自定义导航栏功能 uniapp 在 pages.json 页面设置了全局的 globalStyle 的 "navigationStyle": "custom" 或单页面的 style 的 "navigationStyle": "custom" 之后页面顶部就没有自带的导航栏了&#xff0c;这时用户可自定义该…...

【LeetCode】1448.统计二叉树中好节点的数目

题目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff1a;4 …...

C语言基础之——数组

前言&#xff1a;本篇文章&#xff0c;我们将对一维数组&#xff0c;和二维数组进行展开式的讲解&#xff0c;并进行实际应用。 目录 一.一维数组 1.一维数组的创建和初始化 &#xff08;1&#xff09;数组的创建 &#xff08;2&#xff09;数组的初始化 2.一维数组的使用…...

c# 插入排序

插入排序&#xff08;Insertion Sort&#xff09;&#xff1a;将未排序的元素逐个插入到已排序的序列中的正确位置。 原始数据&#xff1a;{4&#xff0c;3&#xff0c;2&#xff0c;90&#xff0c;10} 第一个循环j0 首先取出索引为1的元素 3 &#xff0c;索引为0的元素4&…...

action和mutation之间的利用 代码解释

场景&#xff1a;购物车点击按钮 context.commit(‘changeCount’, { goodsNum, goodsId })解释这段代码 这段代码是在使用 Vuex 进行状态管理时常见的一种写法。下面对代码进行解释&#xff1a; context.commit 是 Vuex 中的一个方法&#xff0c;用于触发一个名为 changeC…...

WPF基础入门-Class4-WPF绑定

WPF基础入门 Class4&#xff1a;WPF绑定 1、cs文件中设置需要绑定的数据&#xff1a; public partial class Class_4 : Window{public Class_4(){InitializeComponent();List<Color> test new List<Color>();test.Add(new Color() { Code "Yellow",…...

【广州华锐互动】VR高校虚拟实验教学平台提供丰富的资源支持,提高教学效果

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已经逐渐渗透到各个领域&#xff0c;其中包括教育。 广州华锐互动利用VR虚拟现实技术打造的VR高校虚拟实验教学平台&#xff0c;是一种新型的教学工具&#xff0c;它提供了一个在线的教学资源管理平台&#xff0c;包含教学平台、…...

pytorch学习(7)——神经网络优化器torch.optim

1 optim 优化器 PyTorch神经网络优化器&#xff08;optimizer&#xff09;通过调整神经网络的参数&#xff08;weight和bias&#xff09;来最小化损失函数&#xff08;Loss&#xff09;。 学习链接&#xff1a; https://pytorch.org/docs/stable/optim.html 1.1 优化器基类 使…...

leetcode做题笔记​101. 对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 思路一&#xff1a;递归 bool isSymmetric(struct TreeNode* root){if (root NULL) return true;return fun(root->left, root->right); }int fun(struct TreeNode* l_root, struct TreeNode* r_root) {…...

边缘计算相关概念--学习笔记

一.边缘计算概念 边缘计算将数据的处理&#xff0c;应用程序的运行甚至一些功能服务的实现&#xff0c;由网络中心下放到网络边缘的节点上&#xff0c;在网络边缘侧的智能网关上就近采集并且处理数据&#xff0c;不需要将大量未处理的数据上传到远程的大数据平台。边缘计算理论…...

flutter windows编译错误 flutter_assemble.vcxproj

flutter 编译windows是出现错误。 [ 44 ms] d:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(248,5): error MSB8066: &#xfffd;&#xfffd;E:\work\kkview_kuaichuan\kkview_kuaichuan\build\windows\C…...