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

设计模式深入解析与实例应用

目录

  • 工厂模式
    • 1.简单工厂模式
    • 2.工厂方法模式
    • 3.抽象工厂模式
  • 策略模式
  • 责任链模式概述
  • 模板方法模式概述
  • 单例模式概述

工厂模式

工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳实践,旨在将对象的创建过程与使用过程分离,以提高代码的灵活性、可维护性和可扩展性。工厂模式主要有以下三种类型:

简单工厂模式(Simple Factory):
简单工厂不是一个GoF(设计模式的四人帮, Gang of Four)正式提出的设计模式,但它常被认为是工厂方法模式的简化版本。
提供一个统一的接口用于创建相关或依赖对象,而不需要暴露创建逻辑给客户端,也不需要客户端知道具体产品的类。
适用于产品种类不多,且不会频繁新增产品种类的情况。

工厂方法模式 (Factory Method):
属于GoF提出的23种设计模式之一,属于创建型模式。
定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
提高了系统的扩展性,当需要添加新产品时,只需要添加相应的产品类和对应的工厂子类即可,无需修改现有代码。

抽象工厂模式
同样是GoF设计模式之一,也是创建型模式。
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用于系统需要独立于产品的创建、组合和表示的情况下,强调的是“系列”对象的创建,而不是单一产品的创建。
这三种模式从简单到复杂,分别解决了不同复杂度的创建需求,提高了软件的结构灵活性和可维护性。在选择使用哪种工厂模式时,应根据项目的具体需求和未来可能的变化来决定。

1.简单工厂模式

优点 :

  1. 代码解耦:客户端不需要知道具体产品的创建细节,降低了模块间的耦合度。
  2. 易于使用:客户端只需调用一个方法就可以创建对象,使得对象的创建更加简单直观。

缺点:

  1. 违背开闭原则:一旦需要添加新产品,就需要修改工厂类的代码,这增加了系统的复杂性和维护难度。
  2. 不灵活:对于产品类型较多的情况,工厂类可能会变得庞大且难以管理。
    难以支持多态:由于工厂类集中创建所有产品,难以利用多态来减少代码重复。

简单工厂模式示例

// 产品接口
interface Product {void show();
}// 具体产品A
class ConcreteProductA implements Product {@Overridepublic void show() {System.out.println("ConcreteProductA");}
}// 具体产品B
class ConcreteProductB implements Product {@Overridepublic void show() {System.out.println("ConcreteProductB");}
}// 简单工厂
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("Invalid type");}
}public class SimpleFactoryDemo {public static void main(String[] args) {Product productA = SimpleFactory.createProduct("A");productA.show();Product productB = SimpleFactory.createProduct("B");productB.show();}
}

2.工厂方法模式

优点:

  1. 遵循开闭原则:新增产品时,只需要增加对应的产品类和工厂子类,无需修改已有代码。
  2. 高内聚低耦合:每个工厂子类负责一种产品的创建,职责清晰,易于维护和扩展。
  3. 支持多态:通过面向接口编程,可以充分利用多态特性,提高代码的灵活性。

缺点:

  1. 类膨胀:随着产品种类的增加,需要创建大量的工厂类和产品类,可能会导致类的数量急剧增加。
  2. 客户需要知道具体工厂:客户端需要决定使用哪个工厂来创建产品,这在某些情况下可能降低代码的透明度。

工厂方法模式示例

// 抽象工厂
interface Factory {Product createProduct();
}// 具体工厂A
class ConcreteFactoryA implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
}// 具体工厂B
class ConcreteFactoryB implements Factory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
}public class FactoryMethodDemo {public static void main(String[] args) {Factory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.show();Factory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.show();}
}

3.抽象工厂模式

优点:

  1. 系列产品的创建:非常适合创建一系列相关或相互依赖的对象,保持产品族内的产品一致性。
  2. 高度封装:通过抽象工厂,可以隐藏具体产品的创建细节,提供一个高层的接口给客户端使用。
  3. 易于扩展:增加新的产品族时,只需要增加一个新的抽象工厂类和具体工厂类,不影响现有的客户代码。

缺点:

  1. 复杂度提高:抽象工厂模式的结构较为复杂,理解和维护成本相对较高。
  2. 产品族扩展困难:一旦定义好抽象工厂和产品族,向产品族中添加新的产品比较困难,可能需要修改抽象工厂的接口。
    抽象工厂模式示例
    假设我们有两个产品等级结构:操作系统和浏览器。
// 抽象产品:操作系统
interface OperatingSystem {void showOS();
}// 具体产品:Windows操作系统
class Windows implements OperatingSystem {@Overridepublic void showOS() {System.out.println("Windows OS");}
}// 具体产品:Mac操作系统
class Mac implements OperatingSystem {@Overridepublic void showOS() {System.out.println("Mac OS");}
}// 抽象产品:浏览器
interface Browser {void showBrowser();
}// 具体产品:Chrome浏览器
class Chrome implements Browser {@Overridepublic void showBrowser() {System.out.println("Chrome");}
}// 具体产品:Safari浏览器
class Safari implements Browser {@Overridepublic void showBrowser() {System.out.println("Safari");}
}// 抽象工厂
interface AbstractFactory {OperatingSystem createOperatingSystem();Browser createBrowser();
}// 具体工厂:Windows产品族
class WindowsFactory implements AbstractFactory {@Overridepublic OperatingSystem createOperatingSystem() {return new Windows();}@Overridepublic Browser createBrowser() {return new Chrome();}
}// 具体工厂:Mac产品族
class MacFactory implements AbstractFactory {@Overridepublic OperatingSystem createOperatingSystem() {return new Mac();}@Overridepublic Browser createBrowser() {return new Safari();}
}public class AbstractFactoryDemo {public static void main(String[] args) {AbstractFactory windowsFactory = new WindowsFactory();windowsFactory.createOperatingSystem().showOS();windowsFactory.createBrowser().showBrowser();AbstractFactory macFactory = new MacFactory();macFactory.createOperatingSystem().showOS();macFactory.createBrowser().showBrowser();}
}

每种工厂模式都有其适用场景和局限性,选择合适的模式需基于项目的需求、扩展性和维护性等因素综合考虑。

策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户,使代码结构更加灵活,易于扩展。
优点

  1. 算法的封装与互换:策略模式将算法封装在独立的类中,使得算法的变更不会影响到使用算法的客户类,同时也方便在运行时切换算法。
  2. 遵循开闭原则:新增策略时,只需要增加新的策略类,不需要修改原有代码,增强了系统的可扩展性。
    简化复杂条件判断:可以消除大量使用条件语句(如if-else或switch-case)来选择算法的代码,使得代码更加清晰和易于维护。
  3. 提高代码复用性:相同的行为可以被多个上下文重用,减少了代码冗余。

缺点
4. 客户端必须了解策略:客户端需要知道所有策略类的存在,并决定使用哪个策略,这可能会增加客户端的复杂度。
5. 类数量增加:每增加一个策略,就需要增加一个类,可能导致类的数量膨胀。
6. 过度设计风险:对于简单的场景,使用策略模式可能会导致设计过度复杂。

代码示例
假设我们有一个购物车系统,需要根据不同的支付策略计算订单的总金额,比如正常价格、会员折扣价、促销价等。

// 策略接口
interface PaymentStrategy {double calculateTotal(double amount);
}// 具体策略类:正常支付
class NormalPayment implements PaymentStrategy {@Overridepublic double calculateTotal(double amount) {return amount;}
}// 具体策略类:会员折扣支付
class MemberDiscountPayment implements PaymentStrategy {@Overridepublic double calculateTotal(double amount) {return amount * 0.9; // 会员享有10%折扣}
}// 具体策略类:促销支付
class PromotionPayment implements PaymentStrategy {@Overridepublic double calculateTotal(double amount) {return amount * 0.8; // 促销活动打8折}
}// 环境类(Context),使用策略的类
class ShoppingCart {private PaymentStrategy strategy;public void setPaymentStrategy(PaymentStrategy strategy) {this.strategy = strategy;}public double calculateTotal(double amount) {return strategy.calculateTotal(amount);}
}public class StrategyPatternDemo {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 使用会员折扣策略cart.setPaymentStrategy(new MemberDiscountPayment());System.out.println("会员折扣总价:" + cart.calculateTotal(100));// 切换到促销策略cart.setPaymentStrategy(new PromotionPayment());System.out.println("促销活动总价:" + cart.calculateTotal(100));// 使用正常支付策略cart.setPaymentStrategy(new NormalPayment());System.out.println("正常支付总价:" + cart.calculateTotal(100));}
}

责任链模式概述

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理者链进行传递,直到找到能够处理该请求的处理者。每个处理者都包含对下个处理者的引用,如果一个处理者不能处理请求,则会将请求传递给链中的下一个处理者。这样,多个对象都有机会处理请求,从而避免了请求发送者与接收者之间的耦合。
优点

  1. 解耦:发送请求的对象与处理请求的对象解耦,两者不直接关联,易于扩展和维护。
  2. 简化对象:每个处理者只需关注自己的处理逻辑,不需要知道完整的请求处理链。
  3. 灵活性:可以通过添加新的处理者或者改变处理者的顺序来动态地调整处理流程,而无需修改已有代码。

缺点

  1. 不能保证请求被处理:如果链中的所有处理者都不处理请求,请求可能会被忽略。
  2. 调试困难:因为请求的处理路径可能较为复杂,定位问题时可能需要跟踪整个链。
  3. 性能问题:链过长时,请求的处理可能会涉及多个对象,影响系统性能。
  4. 职责链构建复杂性:客户端需要正确构建职责链,不当的配置可能导致循环调用或请求丢失。

代码示例
假设我们有一个简单的审批系统,需要根据不同的金额级别由不同级别的经理进行审批。

// 定义处理请求的接口
interface Approver {void setNextApprover(Approver nextApprover);void processRequest(int amount);
}// 具体处理者:部门经理
class DepartmentManager implements Approver {private Approver nextApprover;@Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}@Overridepublic void processRequest(int amount) {if (amount <= 5000) {System.out.println("部门经理批准了 " + amount + " 元的请求。");} else if (nextApprover != null) {nextApprover.processRequest(amount);}}
}// 具体处理者:总经理
class GeneralManager implements Approver {private Approver nextApprover;@Overridepublic void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}@Overridepublic void processRequest(int amount) {if (amount <= 10000) {System.out.println("总经理批准了 " + amount + " 元的请求。");} else if (nextApprover != null) {nextApprover.processRequest(amount);}}
}// 客户端代码
public class ChainOfResponsibilityDemo {public static void main(String[] args) {Approver departmentManager = new DepartmentManager();Approver generalManager = new GeneralManager();// 构建责任链departmentManager.setNextApprover(generalManager);// 提交请求departmentManager.processRequest(3000);  // 部门经理处理departmentManager.processRequest(8000);  // 总经理处理departmentManager.processRequest(12000); // 未处理,超出了所有处理者的权限}
}

模板方法模式概述

模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以重新定义算法的某些步骤,而不改变算法的结构。
优点

  1. 代码复用:通过将不变部分的代码放在父类的模板方法中,减少代码重复。
  2. 易于扩展:子类可以覆盖父类中的抽象方法,以适应不同的需求,增加新的行为。
  3. 行为控制:父类中的模板方法控制了算法的整体流程,子类则专注于实现细节,有助于保持代码结构清晰。

缺点

  1. 类膨胀:如果算法中有很多可变步骤,会导致子类数量增加,系统复杂度可能会上升。
  2. 难以理解:对于新加入项目的成员来说,理解模板方法模式的结构和意图可能需要更多时间。
  3. 过度设计:对于简单的操作,使用模板方法模式可能会造成不必要的复杂度。
    代码举例
    正在开发一个文件处理框架,该框架需要支持多种文件格式(如TXT、PDF、JPEG)的读取和保存操作。虽然每种文件的读写逻辑不同,但整体流程(打开文件、读取数据、处理数据、保存数据、关闭文件)是相似的。
// 抽象类,定义文件处理的模板方法
abstract class FileProcessor {public final void processFile(String filePath) {openFile(filePath);readFile();processData();writeFile();closeFile();}abstract void openFile(String filePath); // 抽象方法,由子类实现打开文件abstract void readFile(); // 抽象方法,由子类实现读取文件内容abstract void processData(); // 抽象方法,由子类实现数据处理逻辑abstract void writeFile(); // 抽象方法,由子类实现写入文件abstract void closeFile(); // 抽象方法,由子类实现关闭文件
}// 具体实现类,处理TXT文件
class TXTFileProcessor extends FileProcessor {@Overridevoid openFile(String filePath) {System.out.println("Opening TXT file: " + filePath);}@Overridevoid readFile() {System.out.println("Reading TXT content");}@Overridevoid processData() {System.out.println("Processing TXT data");}@Overridevoid writeFile() {System.out.println("Writing processed TXT data back to file");}@Overridevoid closeFile() {System.out.println("Closing TXT file");}
}// 具体实现类,处理PDF文件
class PDFFileProcessor extends FileProcessor {@Overridevoid openFile(String filePath) {System.out.println("Opening PDF file: " + filePath);}@Overridevoid readFile() {System.out.println("Reading PDF content");}@Overridevoid processData() {System.out.println("Processing PDF data");}@Overridevoid writeFile() {System.out.println("Writing processed PDF data back to file");}@Overridevoid closeFile() {System.out.println("Closing PDF file");}
}public class FileProcessingDemo {public static void main(String[] args) {FileProcessor txtProcessor = new TXTFileProcessor();FileProcessor pdfProcessor = new PDFFileProcessor();txtProcessor.processFile("sample.txt"); // 处理TXT文件pdfProcessor.processFile("document.pdf"); // 处理PDF文件}
}

在这个例子中,FileProcessor类定义了处理文件的模板方法,包括打开文件、读取文件、处理数据、写入文件和关闭文件的一系列步骤。TXTFileProcessor和PDFFileProcessor类作为具体实现,分别覆盖了这些抽象方法以实现特定文件格式的处理逻辑。这种设计使得新增其他文件类型的支持变得非常简单,只需要创建一个新的子类并实现相应的抽象方法即可。

单例模式概述

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类在整个应用程序中仅有一个实例,并提供一个全局访问点来获取这个实例。这有助于控制共享资源的访问,比如数据库连接池、日志系统等。
优点

  1. 控制资源访问:限制对昂贵资源的访问,例如数据库连接或线程池,以避免资源浪费。
  2. 全局唯一性:保证系统中某些服务或资源的唯一性,减少因多个实例导致的潜在冲突。
  3. 简化编程模型:对于需要全局访问的对象,开发者无需关心实例化细节,直接使用即可。

缺点

  1. 违反单一职责原则:单例类除了管理自己的状态外,还负责控制自己的创建过程,职责过多。
  2. 测试困难:由于单例的全局状态,测试时难以模拟不同的环境或状态。
  3. 扩展性问题:在需要多个实例或不同配置的场景下,单例模式不够灵活。
  4. 并发问题:在多线程环境下,如果没有正确实现线程安全,可能导致创建多个实例。

代码示例 (Java)
以下是一个线程安全的懒汉式单例模式实现:

public class Singleton {private static volatile Singleton instance;// 私有构造方法,防止外部直接创建实例private Singleton() {}// 获取单例实例的公共方法public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

在这个例子中,Singleton类的构造方法是私有的,防止外部直接实例化。getInstance方法提供了获取单例实例的途径,并使用双重检查锁定(double-checked locking)机制来确保线程安全和性能,即只有在实例为null且需要创建时才进行同步操作。这样既保证了单例的唯一性,又尽可能减少了同步带来的性能开销.

相关文章:

设计模式深入解析与实例应用

目录 工厂模式1.简单工厂模式2.工厂方法模式3.抽象工厂模式 策略模式责任链模式概述模板方法模式概述单例模式概述 工厂模式 工厂模式是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳实践&#xff0c;旨在将对象的创建过程与使用过程分离&#xff0c;以提高代码的…...

服务器数据恢复—异常断电导致RAID6阵列中磁盘出现坏扇区的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台存储中有一组由12块SAS硬盘组建的RAID6磁盘阵列&#xff0c;划分为一个卷&#xff0c;分配给几台Vmware ESXI主机做共享存储。该卷中存放了大量Windows虚拟机&#xff0c;这些虚拟机系统盘是统一大小&#xff0c;数据盘大小不确定&…...

前端工程化08-新的包管理工具pnpm

1、历史原因解读 pnpm这个东西发布的时间是比较早的&#xff0c;但是在最近一两年的时候才开始流行&#xff0c;甚至是可以说非常的盛行&#xff0c;那么这个包到底是个什么东西的&#xff0c;那么我们先说下&#xff0c;原来的包管理工具到底有那些问题&#xff1f;比如说我们…...

章十九、JavaVUE —— 框架、指令、声明周期、Vue-cli、组件路由、Element

目录 一、 框架 ● vue.js 框架 ● 特点 ● Vue 安装 二、 第一个vue程序 ● 创建项目 ​编辑 ● 导入 vue.js ● 创建vue对象&#xff0c;设置属性&#xff0c;使用模版渲染到页面 介绍 — Vue.js (vuejs.org) 三、 vue指令 ● v-text ● v-html ● v-…...

正则表达式阅读理解

这段正则表达式可以匹配什么呢&#xff1f; 超级复杂的一段正则表达式。 ((max|min)\\s*\\([^\\)]*(,[^\\)]*)*\\)|[a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\))(\\s*[-*/%]\\s*([a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][…...

Apache Calcite Linq4j学习

Lin4j简介 Linq4j是Apache Calcite项目中的一个模块&#xff0c;它提供了类似于LINQ&#xff08;Language-Integrated Query&#xff09;的功能&#xff0c;用于在Java中进行数据查询和操作。Linq4j可以将逻辑查询转换为物理查询&#xff0c;支持对集合进行筛选、映射、分组等…...

FPGA SATA高速存储设计

今天来讲一篇如何在fpga上实现sata ip&#xff0c;然后利用sata ip实现读写sata 盘的目的&#xff0c;如果需要再速度和容量上增加&#xff0c;那么仅仅需要增加sata ip个数就能够实现增加sata盘&#xff0c;如果仅仅实现data的读写整体来说sata ip设计比较简单&#xff0c;下面…...

MySQL----为什么选择使用MySQL

在我们日常做项目的过程中&#xff0c;不论是个人还是企业&#xff0c;大多数会选择使用MySQL数据库作为后端数据库存储&#xff0c;它到底有什么优势&#xff0c;能够做到如此广为流传呢&#xff1f; 优点 稳定性&#xff1a;MySQL具有良好的稳定性和可靠性&#xff0c;能够保…...

01.音视频小白系统入门(新专栏)

目录 一、基础知识 二、音频 三、视频 四、流媒体服务器 五、收获 音视频技术在远程办公、在线教育、远程医疗等领域的应用广泛。 学习音视频技术有助于提升职业竞争力&#xff0c;满足市场需求。 掌握音视频基础知识对未来发展至关重要&#xff0c;基础不牢会导致后续学习…...

C++:enum枚举共用体union

enum枚举 C继承C的枚举用法 (1)典型枚举类型定义&#xff0c;枚举变量定义和使用 (2)枚举类型中的枚举值常量不能和其他外部常量名称冲突&#xff1a; 举例1宏定义&#xff0c;举例2另一个枚举 // 定义一个名为Color的枚举类型 enum Color {RED, // 红色&#xff0c;默认值…...

动手学深度学习(Pytorch版)代码实践 -计算机视觉-47转置卷积

47转置卷积 import torch from torch import nn from d2l import torch as d2l# 输入矩阵X和卷积核矩阵K实现基本的转置卷积运算 def trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[0] h - 1, X.shape[1] w - 1))for i in range(X.shape[0]):for j in range(X.shap…...

LinkedIn被封原因和解封方法

对于初识领英和对领英生态规则不熟悉的人来说&#xff0c;很容易造成领英账号被封号(被限制登录)的情况&#xff0c;那么如何才能避免和解决领英帐号被封号(被限制登录)的难题呢&#xff1f; 领英帐号被封号或被限制登录主要会有两类情况。 首先要搞清楚&#xff0c; Linkedi…...

redis sentinel 部署

安装Redis 建议版本不要太低 > 6.2&#xff0c;我这里是redis 7.2.5 curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg echo "deb [signed-by/usr/share/keyrings/redis-archive-keyring.gpg] http…...

spring boot (shiro)+ websocket测试连接不上的简单检测处理

1、用前端连接测试的demo一切正常&#xff0c;但是到了项目中连接不上了 一开始以为是地址错&#xff0c;但是换了apifox测试也是不可以。 2、考虑是shiro进行了拦截了&#xff0c;所以就访问不到了地址&#xff0c;那么就放行。 3、再次用apifox测试&#xff0c;成功了。 当然…...

Jenkins - Python 虚拟环境

Jenkins - Python 虚拟环境 引言Python 虚拟环境创建 Python 虚拟环境安装 virtualenv&#xff08;可选&#xff09;创建虚拟环境激活虚拟环境安装依赖包退出虚拟环境&#xff08;可选&#xff09;注意 Python 虚拟环境实践 引言 Automation 脚本通常会部署到 Jenkins 上运行&…...

每日一道算法题 面试题 08.08. 有重复字符串的排列组合

题目 面试题 08.08. 有重复字符串的排列组合 - 力扣&#xff08;LeetCode&#xff09; Python class Solution:def permutation(self, S: str) -> List[str]:# 以索引记录字符是否用过lelen(S)idx[_ for _ in range(le) ]# 组合得到的字符串combine[]*leans[]# 递归def fu…...

Apache Kylin资源管理全指南:优化你的大数据架构

标题&#xff1a;Apache Kylin资源管理全指南&#xff1a;优化你的大数据架构 摘要 Apache Kylin是一个开源的分布式分析引擎&#xff0c;旨在为大规模数据集提供高性能的SQL查询能力。在Kylin中进行有效的资源管理对于确保查询性能和系统稳定性至关重要。本文将详细介绍如何…...

计算机网络微课堂(湖科大教书匠)TCP部分

计算机网络微课堂&#xff08;湖科大教书匠&#xff09;TCP部分 【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】 TCP的流量控制 一般来说&#xff0c;我们希望数据传输得更快一些。但如果发送方把数据发送得过快&#xff0c;接收方就可能来不及接收&#…...

C++ 字符串介绍

在C编程中&#xff0c;字符串是非常重要的数据类型之一。字符串用于表示文本信息&#xff0c;处理字符串是许多程序的基本需求。C提供了多种方式来处理字符串&#xff0c;包括C风格的字符串&#xff08;C-strings&#xff09;和C标准库中的std::string类。本文将介绍这两种字符…...

[Cloud Networking] BGP

1. AS (Autonomous System) 由于互联网规模庞大&#xff0c;所以网络会被分为许多 自治系统&#xff08;AS-Autonomous system&#xff09;。 所属类型ASN名称IPv4 数量IPv6数量运营商ISPAS3356LEVEL3 - Level 3 Parent, LLC, US29,798,83273,301,954,048互联网企业AS15169GO…...

Typora failed to export as pdf. undefined

变换版本并没有用&#xff0c;调整图片大小没有用 我看到一个博客后尝试出方案 我的方法 解决&#xff1a;从上图中的A4&#xff0c;变为其他&#xff0c;然后变回A4 然后到处成功&#xff0c;Amazing&#xff01; 参考&#xff1a; Typora 导出PDF 报错 failed to export…...

windows 10 安装tcping 使用教程

1 官网下载:tcping下载 2 复制tcping 到win10系统目录C:\Windows\System32 3 tcping 网址测试,可以指定端口 4 tcping 测试端口联通 5 tcping http模式...

[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…...

openstack Y版在ubuntu22.04上不能创建超过8个cpu的虚拟机问题解决

环境 openstack 版本&#xff1a; Y版25.2.1 操作系统&#xff1a;ubuntu22.04 问题 创建16 vcpu的虚拟机&#xff0c;报错&#xff1a; Failed to build and run instance: libvirt.libvirtError: error from service: GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs…...

全国31省细分产品出口数据集(2002-2022年)

数据简介&#xff1a;整理全国31个省直辖市自治区按hs码分的22类细分产品的出口数据&#xff0c;只包含22类的细分&#xff0c;不包含更细的类目。可用来计算出口产品质量&#xff0c;出口产品技术复杂度等指标&#xff0c;数据区间为2002-2022年。 数据名称&#xff1a;31省细…...

1,Windows-本地Linux 系统(WSL)

目录 第一步电脑设置 第二步安装Ubuntu 第三文件传递 开发人员可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。 通过适用于 Linux 的 Windows 子系统 (WSL)&#xff0c;开发人员可以安装 Linux 发行版&#xff08;例如 Ubuntu、OpenSUSE、Kali、Debian、Arc…...

K8S 角色/组件及部署方式的简单概述

1.宏观架构图 2.角色详情 2.1 Master(Controller Plane) 早期是叫 Master 节点&#xff0c;后期改名为 Controller Plane&#xff0c;负责整个集群的控制和管理 Master 不会干活的(当然你让它干也是会干的&#xff0c;涉及到污点容忍)&#xff0c;而是起到访问入口&#xff…...

堆【模板】小根堆堆【模板】大根堆(回)

目录 堆【模板】小根堆 题目描述1 输入1 输出1 样例输入 1 样例输出 1 提示1 代码1 堆【模板】大根堆 题目描述2 输入 输出 样例输入2 样例输出2 提示2 代码2 堆【模板】小根堆 题目描述1 初始小根堆为空&#xff0c;我们需要支持以下3种操作&#xff1a; 操作…...

【JavaScript】JavaScript简介

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 JavaScript入门&#xff08;1&#xff09;————JavaScript简介开篇说明一、什么是JavaScript二、JavaScript的使用2.1 开发工具的选择…...

pg_rman:备份和恢复管理工具#postgresql培训

pg_rman 是 PostgreSQL 的在线备份和恢复工具。 pg_rman 项目的目标是提供一种与 pg_dump 一样简单的在线备份和 PITR 方法。此外&#xff0c;它还为每个数据库集群维护一个备份目录。用户只需一个命令即可维护包括存档日志在内的旧备份。 #PG培训#PG考试#postgresql考试#pos…...

【小学期】常用基于Swing的七个静态界面

示例1&#xff1a;基本的带按钮和标签的界面 import javax.swing.*; import java.awt.*;public class SimpleSwingApp1 {public static void main(String[] args) {JFrame frame new JFrame("Simple Swing App 1");frame.setDefaultCloseOperation(JFrame.EXIT_ON_C…...

JavaScript高级程序设计(第四版)--学习记录之迭代器与生成器(上)

什么是迭代&#xff1f; 迭代的意思是按照顺序反复多次执行一段程序。循环是迭代机制的基础&#xff0c;因为它可以指定迭代的次数&#xff0c;以及每次迭代要执行的操作。 迭代器模式 迭代器模式描述了一个方案&#xff0c;可以把有些结构称为“可迭代对象” &#xff0c;这些…...

51单片机第9步_结构和联合

本章重点学习结构和联合。 //结构和联合应用举例 #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <stdio.h> //包含头文件stdio.h //_getkey();从串口读入一个字符; //putchar();向串口发送一个字节; //printf();向串口发送一串字节; /…...

lua5.3.4的Linux的库文件下载地址

从这个链接选lua5.3.4 Lua Binaries (sourceforge.net) 进入-> 这个页面 LuaBinaries - Browse /5.3.4/Linux Libraries at SourceForge.net 之后就可以下载了。...

网盘挂载系统-知识资源系统-私域内容展示系统

系统介绍&#xff1a; 存储&#xff1a;一共支持约30款云盘存储&#xff0c;其中包括主流的&#xff08;百度网盘、阿里云盘、夸克云盘、迅雷云盘、蓝奏云、天翼云盘&#xff09;&#xff0c;部分展示 以及特别的&#xff08;一刻相册、对象存储、又拍云存储、SFTP、MEGA 网盘…...

水位自动监测摄像机

随着科技的不断进步&#xff0c;水位自动监测摄像机作为现代智能监控技术的重要应用&#xff0c;正在广泛应用于水利工程、防洪管理和环境监测等领域&#xff0c;显著提升了监测效率和数据准确性。水位自动监测摄像机利用高精度摄像头和先进的图像处理技术&#xff0c;能够实时…...

基于SSM+Jsp的疫情居家办公OA系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…...

phpstorm2024代码总是提示“no usages”或者“无用法”解决办法

问题&#xff1a;phpstorm2024使用时&#xff0c;总是会提示无用法&#xff0c;如果没有安装中文语言包的情况下会提示&#xff1a;no usages&#xff0c;如果想关闭怎么办&#xff1f; 编译器右上角点击齿轮进入设置&#xff0c;按照下图的方法点击即可关闭。或者在编译器的“…...

Unity WebGL项目问题记录

一、资源优化 可通过转换工具配套提供的资源优化工具&#xff0c;将游戏内纹理资源针对webgl导出做优化。 工具入口&#xff1a; 工具介绍 Texture 搜索规则介绍 已开启MipMap: 搜索已开启了MipMap的纹理。 NPOT: 搜索非POT图片。 isReadable: 搜索已开启readable纹理。 …...

如何级联移位寄存器(74HC595)

在这个项目中&#xff0c;我们将使用 74HC595 移位寄存器将 2 个移位寄存器级联在一起。这样级联移位寄存器现在可以控制 16 个输出。 当然您可以级联任意数量的移位寄存器。如果您要级联第三个移位寄存器&#xff0c;它可以控制 24 个输出。如果您级联第四个移位寄存器&#x…...

找到你的专属健康食谱:结合肠道菌群与疾病状态

谷禾健康 俗话说&#xff1a;“病从口入”。饮食是决定个人健康状况的重要因素&#xff0c;饮食与疾病的发展有关&#xff0c;特别是胃肠道(GI)疾病。 与膳食相关的症状发生率很高&#xff0c;例如在吸收不良(如乳糖不耐症)情况下出现的腹痛和腹泻&#xff1b;乳糜泻、食物过敏…...

大模型微调实战之基于星火大模型的群聊对话分角色要素提取挑战赛:Task01:跑通Baseline

目录 0 背景1 环境配置1.1 下载包1.2 配置密钥1.3 测试模型 2 解决问题2.1 获取数据2.2 设计Prompt2.2 设计处理函数2.3 开始提取 附全流程代码 0 背景 Datawhale AI夏令营第二期开始啦&#xff0c;去年有幸参与过第一期&#xff0c;收获很多&#xff0c;这次也立马参与了第二…...

大数据开发如何管理项目

在面试的时候总是 会问起项目&#xff0c;那在大数据开发的实际工作中&#xff0c;如何做好一个项目呢&#xff1f; 目录 1. 需求分析与项目规划1.1 需求收集与梳理1.2 可行性分析1.3 项目章程与计划 2. 数据准备与处理2.1 数据源接入2.2 数据仓库建设2.3 数据质量管理 3. 系统…...

在实施数据加密时,有哪些常见的加密技术可供选择?

在实施数据加密时&#xff0c;有哪些常见的加密技术可供选择&#xff1f; 在实施数据加密时&#xff0c;有许多常见的加密技术可供选择&#xff0c;这些技术根据其原理、安全性、效率和适用场景有所不同。以下是一些常见的加密技术&#xff1a; 对称加密&#xff08;Symmetri…...

容易涨粉的视频素材有哪些?容易涨粉的爆款短素材库网站分享

如何挑选社交媒体视频素材&#xff1a;顶级视频库推荐 在社交媒体上脱颖而出&#xff0c;视频素材的选择至关重要。以下是一些顶级的视频素材网站推荐&#xff0c;不仅可以提升视频质量&#xff0c;还能帮助你吸引更多粉丝。 蛙学网&#xff1a;创意的源泉 作为创意和独特性的…...

2024 CISCN 华东北分区赛-Ahisec

Ahisec战队 WEB python-1 break 源码如下&#xff1a; # -*- coding: UTF-8 -*-from flask import Flask, request,render_template,render_template_stringapp Flask(__name__)def blacklist(name):blacklists ["print","cat","flag",&q…...

Linux驱动开发笔记(十三)Sysfs文件系统

文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobject_put()2.2.…...

Numpy array和Pytorch tensor的区别

1.Numpy array和Pytorch tensor的区别 笔记来源&#xff1a; 1.Comparison between Pytorch Tensor and Numpy Array 2.numpy.array 4.Tensors for Neural Networks, Clearly Explained!!! 5.What is a Tensor in Machine Learning? 1.1 Numpy Array Numpy array can only h…...

【面试系列】数据科学家 高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…...

mysql是什么

mysql是什么 是DBMS软件系统&#xff0c;并不是一个数据库&#xff0c;管理数据库 DBMS相当于用户和数据库之间的桥梁&#xff0c;有超过300种不同的dbms系统 mysql是关系型数据库&#xff0c;关系型数据库存储模型很想excel&#xff0c;用行和列组织数据 sql是一门编程语言…...

C语言字节对齐技术在嵌入式、网络与操作系统中的应用与优化

第一部分&#xff1a;嵌入式系统中的字节对齐 嵌入式系统通常对性能和资源有着严格的要求。在这些系统中&#xff0c;字节对齐的正确使用可以显著提高数据访问速度&#xff0c;减少内存占用&#xff0c;并提高系统的整体效率。 一、嵌入式系统中的字节对齐挑战 嵌入式系统中…...

Java [ 基础 ] Java面向对象编程 (OOP) ✨

目录 ✨探索Java基础 Java面向对象编程 (OOP) ✨ 引言 1. 类和对象 2. 封装 3. 继承 4. 多态 5. 抽象 结论 ✨探索Java基础 Java面向对象编程 (OOP) ✨ 引言 Java是一门以面向对象编程&#xff08;OOP&#xff09;为基础的编程语言。OOP的核心概念包括类和对象、封装…...

Qt 基础组件速学 鼠标和键盘事件

学习目标&#xff1a; 鼠标事件和键盘事件应用 前置环境 运行环境:qt creator 4.12 学习内容和效果演示&#xff1a; 1.鼠标事件 根据鼠标的坐标位置&#xff0c;做出对应的事件。 2.键盘事件 根据键盘的输入做出对应操作 详细主要代码 1.鼠标事件 #include "main…...

【笔记】手工部署之linux中开放已安装的mysql与tomcat端口

在需要打包的springboot项目中输入mvn clean package 在target下面获得jar包 进入linux中你想要该jar包存在的位置 将jar包上传至linux中 此时在浏览器中输入linux的ip地址&#xff1a;端口号/mapping路径为404 故&#xff1a; 在linux中另开一个标签页 检查mysql和tomcat已…...

【Unix/Linux】Unix/Linux如何查看系统版本

Unix和Linux查看系统版本的指令有些区别&#xff0c;下面分别介绍: 一.Unix查看系统版本 在Unix系统中&#xff0c;查看系统版本的方法可能会根据具体的Unix操作系统而有所不同。以下是一些通用的方法&#xff0c;适用于多种Unix系统&#xff0c;包括但不限于Solaris、AIX、H…...

HTML中cancas和SVG的是什么以及区别

在HTML中&#xff0c;Canvas和SVG是两个用于图形渲染的技术&#xff0c;它们各自有独特的特点和用途。以下是关于它们的详细解释和区别&#xff1a; Canvas Canvas是HTML5中新增的一个元素&#xff0c;它提供了一个位图渲染环境&#xff0c;允许使用JavaScript在网页上绘制图…...

型格/飞度無限MUGEN版上市售价9.78万元起

3月7日,广汽本田無限MUGEN热血双核在亚洲规模最大的改装车展“2024深圳国际定制改装汽车展览会”上市。型格無限MUGEN版售价15.79万元起,飞度無限MUGEN版售价9.78万元起。型格/飞度無限MUGEN版是市面少有的量产官改神车,上路合规,配齐玩车迷梦寐以求的無限MUGEN定制套件,每…...

FPGA——eMMC验证

一.FPGA基础 1.FPGA烧录流程 (1) 加载流文件 —— bitfile (2) 烧录文件 —— cmm 二.MMC 1.基础知识 (1)jz4740、mmc、emmc、sd之间的关系&#xff1f; jz4740——处理器 mmc——存储卡标准 emmc——mmc基础上发展的高效存储解决方案 sd—— 三.eMMC和SD case验证 1.ca…...

代码随想录算法训练营第22天|● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

二叉搜索树的最近公共祖先 题目链接 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/ 思路 因为是有序树&#xff0c;所以 如果 中间节点是 q 和 p 的公共祖先&#xff0c;那么 中节点的数组 一定是在 [p, q]区间的。即 中节点…...

计算机三级 网络技术

一、边界网关协议BGP BGP是边界网关协议&#xff0c;是外部而不是内部网关协议&#xff08;是不同自治系统的路由器之间使用的协议&#xff09;一个BGP发言人使用TCP&#xff08;不是UDP&#xff09;与其自治系统的BGP发言人交换路由信息。BGP协议交换路由由信息的节点数是以自…...

git教程(IDEA + 命令行)

首先假设你已经安装 git 且 已经初始化完成&#xff1a; // 初始化git config --global user.name "你的用户名" git config --global user.email "你的邮箱"在当前文件夹下创建一个仓库&#xff0c;且该文件夹下会有多个项目 首先在当前文件夹下新建git…...

线上自由DIY预约小程序源码系统 自由DIY你的界面 带完整的的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;移动应用成为人们生活和工作中不可或缺的一部分。预约小程序作为一种便捷的工具&#xff0c;为用户提供了高效的预约服务体验。而线上自由 DIY 预约小程序源码系统则为开发者和企业提供了更大的自由度和创造力&#xff0c;让他们能够根据…...