当前位置: 首页 > 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…...

国外人像摄影网站/青岛最新消息

服务器架构&#xff0c;说简单不简单&#xff0c;说复杂不复杂&#xff0c;前段时间我们请到了国内服务器顶级攻城狮&#xff0c;他把服务器那点事讲得如此通透简单。 对于一个刚起步的创业公司&#xff0c;不需要考虑太多复杂的服务器架构&#xff0c;能把业务跑起来就行了。但…...

乔括云智能建站/百度快照查询入口

一份软件测试报告对于企业来说有着众多的用途&#xff0c;可以在软件项目验收、软件产品登记测试等都有着硬性的要求需要软件测试报告&#xff0c;对软件测试报告有所了解的一般都知道报告里面都有着软件的种种测试情况&#xff0c;但是有的软件测试报告内容很多&#xff0c;但…...

深圳网站设计兴田德润优惠吗/500个游戏推广群

概述近期一个客户的一张单表&#xff0c;每天delete7天前的数据&#xff0c;每天的数据增量没什么变化&#xff0c;理论上来说&#xff0c;delete释放的空间是可重用的&#xff0c;但发现该表段最近一直在增长&#xff0c;现在大小为300G&#xff0c;170G的75% – 100% free sp…...

注册做网站的公司/软文写作什么意思

远程连接服务器怎么传送文件 内容精选换一换获取登录密码使用公共镜像创建的云服务器&#xff0c;默认已经安装一键式重置密码插件。如果您忘记密码或密码过期&#xff0c;可以通过重置密码重新设置云服务器登录密码。重置密码使用公共镜像创建的云服务器&#xff0c;默认已经安…...

飞言情做最好的小说网站/关键词排名优化公司

昨天在项目中&#xff0c;需要想系统的日志中写入相应的日志信息&#xff0c;比如错误日志&#xff0c;所以便在园里看了看&#xff0c;发现了一篇不错的文章。 http://www.cnblogs.com/nokiaguy/archive/2009/02/26/1398708.html 具体内容不说了&#xff0c;看这个文章就好&am…...

建设银行网站打印账单/优化精灵

当数据在网络上传播的时候&#xff0c;通过使用 SSL 对其进行加密和保护&#xff0c;JSSE 为 Java 应用程序提供了安全的通信。在本篇有关该技术的高级研究中&#xff0c;Java 中间件开发人员 Ian Parkinson 深入研究了 JSSE API 较不为人知的方面&#xff0c;为您演示了如何围…...