Java 企业级开发设计模式全解析
Java 企业级开发设计模式全解析
在 Java 企业级开发的复杂领域中,设计模式如同精湛的工匠工具,能够帮助开发者构建高效、可维护、灵活且健壮的软件系统。它们是无数开发者在长期实践中总结出的解决常见问题的最佳方案,掌握这些模式对于提升开发水平和系统质量至关重要。本文将深入探讨 Java 企业级开发中常用的设计模式,涵盖创建型、结构型和行为型模式,结合实际场景分析其应用价值。
一、创建型模式:对象构建的艺术
创建型模式主要用于解决对象的创建问题,通过不同的方式控制对象的创建过程,确保对象的创建符合特定的需求和场景。
(一)工厂模式(Factory Pattern)
模式定义与分类
工厂模式是创建型模式中最常用的模式之一,其核心思想是将对象的创建过程封装起来,客户端无需知道具体的创建细节,只需通过工厂类获取所需对象。工厂模式主要包括简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式通过一个工厂类来创建不同类型的产品对象,它根据传入的参数来决定创建哪个具体产品类的实例。工厂方法模式则定义了一个创建产品对象的接口,由具体的工厂类来实现该接口,创建具体的产品对象。抽象工厂模式是工厂方法模式的扩展,它可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类。
应用场景
在企业级开发中,当需要创建的对象类型较多,且客户端不希望直接依赖于具体的对象创建过程时,工厂模式是一个理想的选择。例如,在一个支持多种数据库(如 MySQL、Oracle、SQL Server)的应用中,可以使用工厂模式来创建不同数据库的连接对象和操作对象,客户端只需知道工厂类,而无需关心具体的数据库类型和创建细节。
代码示例(工厂方法模式)
// 产品接口
interface DatabaseConnection {
void connect();
}
// 具体产品:MySQL连接
class MySQLConnection implements DatabaseConnection {
@Override
public void connect() {
System.out.println("Connecting to MySQL database");
}
}
// 具体产品:Oracle连接
class OracleConnection implements DatabaseConnection {
@Override
public void connect() {
System.out.println("Connecting to Oracle database");
}
}
// 工厂接口
interface DatabaseConnectionFactory {
DatabaseConnection createConnection();
}
// 具体工厂:MySQL工厂
class MySQLConnectionFactory implements DatabaseConnectionFactory {
@Override
public DatabaseConnection createConnection() {
return new MySQLConnection();
}
}
// 具体工厂:Oracle工厂
class OracleConnectionFactory implements DatabaseConnectionFactory {
@Override
public DatabaseConnection createConnection() {
return new OracleConnection();
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
DatabaseConnectionFactory factory = new MySQLConnectionFactory();
DatabaseConnection connection = factory.createConnection();
connection.connect();
}
}
优势与注意事项
工厂模式的优势在于解耦了对象的创建和使用,提高了代码的可维护性和扩展性。当需要新增一种产品类型时,只需新增对应的具体产品类和具体工厂类,无需修改客户端代码。但需要注意的是,简单工厂模式可能会导致工厂类过于复杂,违反开闭原则,因此在实际应用中,更推荐使用工厂方法模式或抽象工厂模式。
(二)单例模式(Singleton Pattern)
模式定义
单例模式确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来访问该实例。单例模式常用于管理共享资源,如配置管理器、日志记录器、数据库连接池等。
实现方式
单例模式的实现方式主要有饿汉式、懒汉式、双重检查锁定(DCL)、静态内部类和枚举单例等。其中,枚举单例是最简洁、安全的实现方式,它不仅能避免多线程环境下的问题,还能防止反序列化重新创建实例。
// 枚举单例
enum Singleton {
INSTANCE;
// 单例实例的方法
public void doSomething() {
System.out.println("Doing something in Singleton");
}
}
应用场景
在企业级开发中,当需要确保某个类在全局范围内只有一个实例,并且该实例需要被频繁访问时,单例模式是首选。例如,Spring 框架中的 ApplicationContext 就是一个单例容器,它负责管理应用中的 Bean 实例,确保每个 Bean 在默认情况下都是单例的。
注意事项
单例模式虽然有很多优点,但也存在一些缺点。例如,单例类的职责可能过于集中,不利于测试和扩展;同时,在多线程环境下,如果实现不当,可能会导致线程安全问题。因此,在使用单例模式时,需要根据具体的场景选择合适的实现方式,并注意代码的正确性和线程安全性。
二、结构型模式:对象组合的智慧
结构型模式主要用于处理类或对象的组合问题,通过不同的方式将类或对象组合成更大的结构,以满足复杂的业务需求。
(一)代理模式(Proxy Pattern)
模式定义
代理模式为其他对象提供一种代理或占位符,以控制对原对象的访问。代理对象可以在不修改原对象的情况下,为原对象添加额外的功能,如访问控制、日志记录、缓存等。
应用场景
在企业级开发中,代理模式有广泛的应用。例如,远程代理可以用于访问远程服务器上的对象,如 RMI(Remote Method Invocation)中的代理对象;虚拟代理可以用于延迟加载对象,当对象比较复杂或占用资源较多时,先创建代理对象,直到真正需要时再加载实际对象;保护代理可以用于控制对原对象的访问权限,确保只有符合条件的客户端才能访问原对象。
代码示例(静态代理)
// 真实主题接口
interface Subject {
void request();
}
// 真实主题类
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject handling request");
}
}
// 代理类
class ProxySubject implements Subject {
private RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
// 前置处理
System.out.println("Proxy before request");
realSubject.request();
// 后置处理
System.out.println("Proxy after request");
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
Subject subject = new ProxySubject();
subject.request();
}
}
优势与扩展
代理模式的优势在于解耦了客户端和原对象,客户端只需与代理对象交互,而无需知道原对象的存在。同时,代理模式可以很方便地为原对象添加各种额外功能,符合开闭原则。在 Java 中,动态代理(如 Java 反射中的 Proxy 类)可以在运行时动态生成代理类,进一步提高了代理模式的灵活性和适用性,Spring AOP 就是基于动态代理实现的。
(二)装饰模式(Decorator Pattern)
模式定义
装饰模式动态地给一个对象添加额外的职责,而不改变其原有的结构。它通过创建一个包装对象(装饰器)来包裹原对象,在不修改原对象代码的情况下,为其添加新的功能。
应用场景
在企业级开发中,当需要为对象动态添加功能,且这些功能可以相互组合时,装饰模式是一个很好的选择。例如,Java IO 库中的输入输出流处理就广泛使用了装饰模式。InputStream 的子类如 FileInputStream 是具体的组件,而 BufferedInputStream、DataInputStream 等则是装饰器,它们可以为 FileInputStream 添加缓冲、数据解析等功能,并且可以组合使用。
代码示例
// 组件接口
abstract class Beverage {
protected String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
// 具体组件:咖啡
class Coffee extends Beverage {
public Coffee() {
description = "Coffee";
}
@Override
public double cost() {
return 10.0;
}
}
// 装饰器抽象类
abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
// 具体装饰器:牛奶
class Milk extends CondimentDecorator {
private Beverage beverage;
public Milk(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
@Override
public double cost() {
return beverage.cost() + 2.0;
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
Beverage beverage = new Coffee();
beverage = new Milk(beverage);
System.out.println(beverage.getDescription() + " costs $" + beverage.cost());
}
}
模式特点
装饰模式与继承相比,具有更高的灵活性。继承是静态的,一旦子类创建,其功能就固定下来;而装饰模式可以在运行时动态地组合装饰器,为对象添加不同的功能,并且可以自由地撤销或更换装饰器。这种特性使得装饰模式在需要灵活扩展对象功能的场景中非常有用。
三、行为型模式:对象交互的逻辑
行为型模式主要用于描述对象之间的交互和通信方式,解决对象之间的协作问题,使系统中的对象能够更好地协同工作。
(一)策略模式(Strategy Pattern)
模式定义
策略模式定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。客户端可以根据不同的场景选择不同的算法策略,从而使得算法的变化不会影响到使用算法的客户端。
应用场景
在企业级开发中,当存在多种不同的算法或策略来完成同一任务,且这些算法需要在运行时动态切换时,策略模式是理想的选择。例如,支付系统中可能支持多种支付方式(如支付宝、微信支付、银联支付),每种支付方式的实现逻辑不同,但都需要完成支付功能。使用策略模式可以将每种支付方式封装为一个策略类,客户端根据用户的选择调用相应的策略类来完成支付操作。
代码示例
// 策略接口
interface PaymentStrategy {
void pay(double amount);
}
// 具体策略:支付宝支付
class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " via Alipay");
}
}
// 具体策略:微信支付
class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " via WeChat Pay");
}
}
// 上下文类
class PaymentContext {
private PaymentStrategy strategy;
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void pay(double amount) {
strategy.pay(amount);
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
context.setStrategy(new AlipayStrategy());
context.pay(100.0);
context.setStrategy(new WeChatPayStrategy());
context.pay(200.0);
}
}
模式优势
策略模式将算法的定义和使用分离,使得算法可以独立于客户端进行扩展和修改。客户端只需知道策略接口,而无需了解具体的策略实现,提高了代码的可维护性和扩展性。同时,策略模式可以很方便地添加新的策略类,符合开闭原则。
(二)观察者模式(Observer Pattern)
模式定义
观察者模式定义了对象之间的一种一对多的依赖关系,当一个对象(被观察者)的状态发生变化时,所有依赖于它的对象(观察者)都会自动收到通知并更新自己。
应用场景
在企业级开发中,观察者模式常用于实现事件驱动的系统,如消息订阅与发布、界面组件的事件处理等。例如,在一个股票交易系统中,当股票价格发生变化时,需要及时通知所有关注该股票的用户;在 Java Swing 中,按钮的点击事件处理就是通过观察者模式实现的,按钮作为被观察者,注册的监听器作为观察者,当按钮被点击时,通知所有监听器进行处理。
代码示例(Java 内置观察者模式)
import java.util.Observable;
import java.util.Observer;
// 被观察者
class Stock extends Observable {
private double price;
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
setChanged();
notifyObservers(price);
}
}
// 观察者
class Investor implements Observer {
private String name;
public Investor(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
double price = (double) arg;
System.out.println(name + " received price update: " + price);
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
Stock stock = new Stock();
Investor investor1 = new Investor("Alice");
Investor investor2 = new Investor("Bob");
stock.addObserver(investor1);
stock.addObserver(investor2);
stock.setPrice(100.0);
stock.setPrice(105.0);
}
}
模式改进
Java 内置的观察者模式存在一些不足,如被观察者的 Observable 类是一个具体类,限制了继承的灵活性,并且通知观察者时的参数传递不够灵活。在实际开发中,通常会自定义观察者模式的接口和实现,以提高灵活性和适用性。例如,定义 Subject 接口和 Observer 接口,被观察者实现 Subject 接口,观察者实现 Observer 接口,通过这种方式实现更灵活的观察者模式。
四、设计模式的综合应用与最佳实践
(一)模式的组合使用
在实际的企业级开发中,很少会单独使用一种设计模式,而是根据具体的需求组合使用多种模式。例如,在 Spring 框架中,工厂模式用于创建 Bean 实例,代理模式用于实现 AOP 功能,观察者模式用于实现事件驱动机制,装饰模式用于为 Bean 添加额外的功能等。通过多种模式的组合使用,可以构建出功能强大、灵活可扩展的系统。
(二)遵循设计原则
设计模式是设计原则的具体实现,在使用设计模式时,需要遵循 SOLID 原则(单一职责原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则)等设计原则。这些原则是指导我们合理使用设计模式的核心思想,确保系统具有良好的结构和可维护性。
(三)注重代码可读性和可维护性
虽然设计模式可以提高代码的质量,但过度使用设计模式可能会导致代码变得复杂难懂。因此,在使用设计模式时,需要根据实际情况进行权衡,避免为了使用模式而使用模式。代码的可读性和可维护性始终是首要考虑的因素,设计模式应该是为了更好地解决问题,而不是增加问题的复杂性。
结语
Java 企业级开发设计模式是开发者在复杂系统构建中不可或缺的工具,它们蕴含着丰富的设计思想和实践经验。通过深入理解和熟练运用创建型、结构型和行为型模式,开发者能够更加高效地解决实际问题,构建出高质量的软件系统。
在学习设计模式的过程中,不仅要掌握每种模式的定义、实现和应用场景,更要理解其背后的设计原则和思维方式。通过不断地实践和总结,将设计模式融入到日常的开发中,逐渐形成良好的设计习惯和编程思维。
随着技术的不断发展和企业级开发需求的日益复杂,设计模式也在不断演进和扩展。持续关注设计模式的最新动态和应用案例,将有助于我们更好地应对各种开发挑战,创造出更加优秀的软件产品。
相关文章:
Java 企业级开发设计模式全解析
Java 企业级开发设计模式全解析 在 Java 企业级开发的复杂领域中,设计模式如同精湛的工匠工具,能够帮助开发者构建高效、可维护、灵活且健壮的软件系统。它们是无数开发者在长期实践中总结出的解决常见问题的最佳方案,掌握这些模式对于提升开…...
高并发内存池
文章目录 前言一、项目介绍二、内存池介绍1.池化技术2.内存池3.malloc视角下内存的管理 三、定长内存池3.1 设计思路3.2 数据结构 四、高并发内存池整体框架设计4.1 thread cachethreadcache哈希桶映射对齐规则threadcache TLS无锁访问 4.2 central cachecentral cache结构设计…...
常用对称加密算法的Python实现及详解
文章目录 **常用对称加密算法的Python实现及详解****1. 对称加密概述****1.1 对称加密的基本原理****1.2 对称加密的分类****1.3 对称加密的应用** **2. DES(Data Encryption Standard)****2.1 算法原理****2.2 Python实现****2.3 安全性分析** **3. 3DE…...
ByteArrayInputStream 类详解
ByteArrayInputStream 类详解 ByteArrayInputStream 是 Java 中用于从字节数组读取数据的输入流,位于 java.io 包。它允许将内存中的字节数组当作输入流来读取,是处理内存数据的常用工具。 1. 核心特性 内存数据源:从字节数组(b…...
MySQL C API高效编程:C语言实现数据库操作的深入解析
知识点【MySQL C API】 1、头文件及MYSQL * 句柄 //头文件 #include <mysql/mysql.h>1、MYSQL MYSQL是一个结构体,封装了与数据库连接相关的所有状态,配置和数据。 2、MYSQL *的本质 类似于 FILE*,代表一个与数据库连接的通道&…...
字符串,数组,指针之间的关系
在C语言中,字符串、指针和数组之间有着紧密且复杂的关系,它们在内存存储、操作方式等方面相互关联,以下为你详细介绍: 字符串 定义:字符串是由字符组成的序列,以空字符(\0)作为结束…...
2025流感疫苗指南+卫健委诊疗方案|高危人群防护+并发症处理 慢性肾脏病饮食指南2025卫健委版|低盐低磷食谱+中医调理+PDF 网盘下载 pdf下载
2025 年卫健委发布的《成人肥胖食养指南(2024 年版)》为减肥提供了科学的饮食指导。 📢提示:文章排版原因,资源链接地址放在文章结尾👇👇,往下翻就行 📢提示࿱…...
学习路线(机器人软件架构)
机器人软件系统架构从入门到专家学习路线 一、基础阶段(6-12个月)基础知识储备机器人基础概念:编程技能必备语言:工具链: 入门框架推荐资源: 中级阶段(1-2年)系统架构基础ROS进阶架构…...
Stellaris 群星 [DLC 解锁] CT 表 [Steam] [Windows SteamOS macOS]
Stellaris 群星 [DLC 解锁] & CT 表 [Steam] [Windows & SteamOS & macOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章,具体最新版本见下载文件说明; DLC 解锁列表(仅供参考) 《群星》 - Symbols of Domina…...
题目 3321: 蓝桥杯2025年第十六届省赛真题-画展布置
题目 3321: 蓝桥杯2025年第十六届省赛真题-画展布置 时间限制: 2s 内存限制: 192MB 提交: 673 解决: 130 题目描述 画展策展人小蓝和助理小桥为即将举办的画展准备了 N 幅画作,其艺术价 值分别为 A1, A2, . . . , AN。他们需要从这 N 幅画中挑选 M 幅,并…...
Excel 查询之 iNDEX与MATCH组合
在Excel日常工作中,数据查询是最常见的操作之一。虽然VLOOKUP函数广为人知,但它有一个明显的局限性——要求查询值必须位于返回值的左侧。今天我要介绍一个更灵活、更强大的组合:INDEX和MATCH函数。 为什么选择INDEXMATCH? VLOO…...
【Leetcode 每日一题 - 补卡】1128. 等价多米诺骨牌对的数量
问题背景 给你一组多米诺骨牌 d o m i n o e s dominoes dominoes。 形式上, d o m i n o e s [ i ] [ a , b ] dominoes[i] [a, b] dominoes[i][a,b] 与 d o m i n o e s [ j ] [ c , d ] dominoes[j] [c, d] dominoes[j][c,d] 等价 当且仅当 ( a c a c …...
【Elasticsearch入门到落地】12、索引库删除判断以及文档增删改查
接上篇《11、RestClient初始化索引库》 上一篇我们完成了使用RestHighLevelClient创建索引库的代码实现,本篇将讲解如何判断索引库是否存在并删除它,以及如何对索引库中的文档进行增删改查操作。 一、索引库判断与删除 在操作索引库时,有时…...
36、C#中的⽅法声明参数关键字params,ref,out的意义及⽤法
在C#中,params、ref 和 out 是方法声明中用于修饰参数的关键字,它们各自有不同的用途和语义。以下是它们的详细说明和用法: 1、 params 关键字 意义 params 允许方法接受可变数量的参数,这些参数会被编译为一个数组。适用于参数…...
DEX平台引领风尚 XBIT让数字资产回归简单与透明
近日,全球加密货币市场持续升温,Dex 交易平台成为众多投资者关注焦点,其中XBIT去中心化交易所平台凭借独特优势脱颖而出。 图片来源:币界网 在当今加密货币领域,交易平台的安全性与便捷性至关重要。XBIT去中心化交易所…...
基于Python+MongoDB猫眼电影 Top100 数据爬取与存储
前言:从猫眼电影排行榜页面(TOP100榜 - 猫眼电影 - 一网打尽好电影 )爬取 Top100 电影的电影名称、图片地址、主演、上映时间和评分等关键信息,并将这些信息存储到本地 MongoDB 数据库中,🔗 相关链接Xpath&…...
Linux文件复制命令精要指南:cp与scp详解
大家好,欢迎来到程序视点!我是你们的老朋友.小二! Linux文件复制命令精要指南:cp与scp详解 一、cp命令(本地文件复制) 核心功能 复制文件/目录到目标路径,支持重命名及批量操作。 关键参数 …...
Qt实现网页内嵌
文章目录 一、环境准备 二、代码实现 三、测试 一、环境准备 首先,确保你的Qt安装包含了QtWebEngine模块。我的Qt是5.12.9并且使用MSVC来编译项目。在项目文件中需要添加以下配置,其中在Qt中配置MSVC,建议去看看这位大佬的博客:…...
Kotlin中 StateFlow 或 SharedFlow 或 LiveData的区别
在Android开发中,处理数据流是常见的需求,特别是在UI更新和数据共享方面。Kotlin提供了几种不同的工具来帮助开发者实现这一需求,包括StateFlow、SharedFlow和LiveData。每种工具都有其特点和使用场景,下面我们将逐一比较它们的区…...
jupyter notebook运行简单程序
一. 使用 cmd 创建虚拟环境 1.创建虚拟环境 (1)创建新的虚拟环境(本项目名设置为zhineng),并设置python版本 conda create -n zhineng python3.6 (2)查看python版本 python --version &am…...
查看Ubuntu版本
1. 使用 lsb_release 命令(推荐) lsb_release -a输出示例: ubuntuVM-0-6-ubuntu:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04 LTS Release: 22.04 Codename: jamm…...
《算法导论(第4版)》阅读笔记:p7-p8
《算法导论(第4版)》学习第 5 天,p7-p8 总结,总计 2 页。 一、技术总结 1.算法解决什么问题? DNA测序问题(Dynamic Programming, 动态规划),寻找路径问题,加密问题,利益最大化问题(linear programming, …...
AI笔记-1
Halide Perovskites (HPs) 卤化物钙钛矿 卤化物钙钛矿(HPs)已被 公认为 光伏和发光器件 中最有前途的材料之一 在本观点中,我们将探讨钙钛矿的定义,主要聚焦于由 较重卤素(Cl、Br和I)组成的钙钛矿亚群&…...
【C++重载操作符与转换】成员访问操作符
目录 一、点操作符(.) 1.1 基本概念 1.2 点操作符不能被重载 二、箭头操作符(->) 2.1 基本概念 2.2 箭头操作符的重载 2.3 箭头操作符重载的特殊规则 三、成员指针操作符(.*)和指向成员指针的箭…...
java单元测试代码
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; import java.util.List;public class UserServiceTest {Testpublic void testSearchUserByTags() {// 模拟标签列表List<String> tagNameList List.of("tag1", "…...
Vue中的过滤器参数:灵活处理文本格式化
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
【神经网络与深度学习】深度学习中的生成模型简介
深度学习中的生成模型 openai 的一个古早介绍 引言 深度学习中的生成模型能够学习数据分布并生成新数据,在人工智能的多个领域中都有重要应用。不同类型的生成模型在原理和结构上各有特点,适用于不同的任务,如图像生成、文本生成和时间序列…...
Docker(三):DockerFile
一、DockerFile介绍 1、DockerFile 介绍 DockerFile 是一种能够被Docker 程序解释的文件(一般为了方便理解称之为“剧本”)。 DockerFile 由一条一条的指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器 镜像中指定自己额外的需…...
使用OpenCV 和 Dlib 实现疲劳检测
文章目录 引言1.相关技术介绍2. 系统原理2.1 眼睛纵横比(EAR)算法2.2 系统工作流程 3.代码解析3.1 关键函数说明3.2 主循环逻辑 4.实际应用效果5.参数调优建议6.总结 引言 疲劳驾驶是交通事故的主要原因之一。本文将介绍如何使用Python和计算机视觉技术构建一个实时疲劳驾驶检…...
Python格式化字符串的四种方法
Python格式化字符串的四种方法 1.使用 % 运算符 %s 是一个字符串的占位符,而 “World” 是替换它的值 print("Hello, %s!" % "World") # 输出:Hello, World!你可以使用多个占位符 注意:多个变量占位,变量要…...
蓝桥杯 18. 积木
积木 原题目链接 题目描述 小明用积木搭了一个城堡。为了方便,小明使用的是大小相同的正方体积木,并将其搭建在一个 n 行 m 列的方格图上。每个积木占据方格图中的一个小格子。 小明的城堡是立体的,可以将积木垒在其他积木上。当某个格子…...
解决因字段过长使MYSQL数据解析超时导致线上CPU告警问题
1.首先发生CPU告警 占有率到98.8% 2.DBA找到最终的原因是这条SQL导致 select * from trade_order_sku_071 where order_id in ( P760205793431071471 ) and user_id in ( 67d9158c000000000e0134ff );” 3.观察系统指标,发现CPU和网络同时飙升,同时网络…...
Python中的客户端和服务端交互的基本内容
目录 网络协议 网络的通信方式 需要安装的组件和需要导入的包模块 安装的组件 导入包模块 如何创建客户端 如何创建服务端 网络协议 IPV4:是互联网协议的第四版,也是目前广泛使用的网络协议。它使用32位地址格式,理论上可以提供约43亿…...
Compose 中使用 WebView
在 Jetpack Compose 中,我们可以使用 AndroidView 组件来集成传统的 Android WebView。以下是几种实现方式: 基础 WebView 实现 Composable fun WebViewScreen(url: String) {AndroidView(factory { context ->WebView(context).apply {// 设置布局…...
PyCharm 安装教程
## 简介 PyCharm 是由 JetBrains 公司开发的一款优秀的 Python 集成开发环境(IDE),提供了代码分析、图形化调试器、集成测试器和版本控制系统等功能。PyCharm 有两个版本: - **专业版(Professional)**&am…...
基于MATLAB的图像色彩识别项目,彩色图像矩阵识别
一、项目背景 在本次IP Lab项目中,我们模拟了游戏“Lego’s Life of George”的玩法。游戏要求玩家在屏幕短暂展示图像后,凭借记忆重建乐高结构。我们面临的任务是处理一系列存在各种缺陷的图像,像噪声干扰、旋转以及投影问题等,…...
springboot应用大批量导出excel产生oom处理措施实践(适用于poieasyexcel)
一、背景: 在某些信息管理场景中,存在大批量导出需求,例如一次性导出10~100w行excel数据,如果不做特殊的处理,很容易导致Out Of Memory,特别是堆内存溢出。 oom复现 例如修改IDEA运行配置,VM…...
OpenCV 第6课 图像处理之几何变换(透视)
1、透视变换 2、数学公式 3、透视变换矩阵的生成 4、图像变换函数 5、例程 1、透视变换 OpenCV中的透视变换是一种几何变换,用于将图像从一个平面映射到另一个平面。它通过4个对应点之间的映射关系来变换图像,使得变换后的图像看起来像从不同角度观看。透视变换常用于图像…...
SpringMVC 框架核心知识点详解与实战
文章目录 引言一、响应数据和结果视图1.1 开发环境搭建1.2 返回值类型1.3 转发与重定向1.4 响应 json 数据1.5 静态资源处理 二、SpringMVC 实现文件上传2.1 准备工作2.2 传统方式文件上传 三、SpringMVC 的异常处理3.1 异常处理思路3.2 实现异常处理 四、SpringMVC 框架中的拦…...
Web前端开发:Grid 布局(网格布局)
一、Grid 是什么? Grid(网格布局) 是 CSS 中一种二维布局系统,可以同时控制行和列的排列方式。相比传统的浮动布局和 Flexbox(一维布局),Grid 更适合构建复杂的网页结构(比如仪表盘、…...
时间同步服务
时间同步:多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等,利用NTP(Network Time Protocol )协议使网络中的各个计算机 时间达到同步。目前NTP协议…...
全球化电商平台Azure云架构设计
业务需求: 支撑全球三大区域(北美/欧洲/亚洲)用户访问,延迟<100ms处理每秒50,000订单的峰值流量混合云架构整合本地ERP系统全年可用性99.99%满足GDPR和PCI DSS合规要求 建议在实施时使用Azure Landing Zone框架进行部署&…...
【SaaS多租架构】数据隔离与性能平衡
SaaS多租户架构:数据隔离与性能平衡 一、技术背景及发展二、技术特点:数据隔离与性能优化的双核心三、技术细节:实现路径与关键技术四、实际案例分析五、未来发展趋势结语一、技术背景及发展 多租户架构是云计算与SaaS(软件即服务)模式的核心技术,其核心目标是通过共享基…...
ARM介绍及其体系结构
目录 一、ARM介绍 (一)公司层面 (二)技术层面 (三)微处理器芯片或产品方面 二、ARM体系结构 (一)指令集 (二)寄存器组织 (三)存…...
3DGS-slam:splatam公式
配套讲解视频:https://www.bilibili.com/video/BV1ZgfBYdEpg/?spm_id_from333.1387.homepage.video_card.click&vd_sourced4c3e747c32049ddd90dcce17208f4e0 1、多维高斯分布公式: 对于多维(多变量)高斯分布,概率密度函数的…...
阿里云服务器深度科普:技术架构与未来图景
阿里云服务器深度科普:技术架构与未来图景 一、起源与演进:从虚拟化到云原生 阿里云服务器(Elastic Compute Service, ECS)诞生于阿里巴巴集团对云计算技术的早期探索。2009年,阿里云团队启动自主研发,…...
物联网之对接MQTT最佳实践
小伙伴们,你们好呀,我是老寇,跟我一起学习对接MQTT 安装EMQX 采用docker-compose一键式,启动!!! 还没有安装docker朋友,参考文章下面两篇文章 # Ubuntu20.04安装Docker # Cento…...
基于C++实现的深度学习(cnn/svm)分类器Demo
1. 项目简介 本项目是一个基于C实现的深度学习与传统机器学习结合的分类器Demo,主要流程为: 从CSV文件读取样本数据用卷积神经网络(CNN)进行特征提取用支持向量机(SVM)进行最终分类支持模型的保存与加载提…...
探寻适用工具:AI+3D 平台与工具的关键能力及选型考量 (AI+3D 产品经理笔记 S2E03)
引言:从技术光谱到落地选择的桥梁 在前两篇笔记中,我们首先(S2E01)宏观地探讨了 AI 生成 3D 技术兴起的驱动力、核心价值与面临的挑战,随后(S2E02)深入辨析了 Text-to-3D、Image-to-3D、NeRF 等…...
软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(1)
本文内容参考: 黑盒测试和白盒测试详解-CSDN博客 软件测试中的各种覆盖(Coverage)详解-CSDN博客 特此致谢! 零、概述 黑盒测试又名为功能测试,主要目的是发现软件设计的需求或者是软件设计规格说明书中的错误缺陷。…...