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

Python设计模式终极指南:18种模式详解+正反案例对比+框架源码剖析

下面我将全面解析18种Python设计模式,每种模式都包含实际应用场景、优缺点分析、框架引用案例、可运行代码示例以及正反案例对比,帮助您深入理解设计模式的价值。

一、创建型模式(5种)

1. 单例模式(Singleton)

场景:数据库连接池、全局配置管理
优点:资源复用,保证全局一致性
缺点:违反单一职责,多线程需同步
框架应用:Django配置对象 django.conf.settings

class DatabaseConnection:_instance = Nonedef __new__(cls):if not cls._instance:cls._instance = super().__new__(cls)# 模拟数据库连接初始化print("创建新的数据库连接(昂贵操作)")return cls._instance# 正面示例
db1 = DatabaseConnection()
db2 = DatabaseConnection()
print(db1 is db2)  # True,复用同一连接# 反面示例(无单例)
class BadDatabase:def __init__(self):print("创建新的数据库连接(昂贵操作)")db3 = BadDatabase()
db4 = BadDatabase()  # 重复创建连接,浪费资源

2. 工厂方法模式(Factory Method)

场景:支付网关切换、日志处理器选择
优点:解耦客户端和具体类
缺点:增加代码复杂度

from abc import ABC, abstractmethodclass PaymentGateway(ABC):@abstractmethoddef pay(self, amount): passclass StripeGateway(PaymentGateway):def pay(self, amount): print(f"Stripe支付 ${amount}")class PayPalGateway(PaymentGateway):def pay(self, amount): print(f"PayPal支付 ${amount}")def payment_factory(gateway_type):if gateway_type == "stripe": return StripeGateway()if gateway_type == "paypal": return PayPalGateway()raise ValueError("无效支付网关")# 正面示例
payment = payment_factory("stripe")
payment.pay(100)  # 客户端无需知道具体实现类# 反面示例(硬编码依赖)
class OrderProcessor:def process_payment(self, amount):gateway = StripeGateway()  # 直接依赖具体类gateway.pay(amount)# 更换支付网关需修改源码

3. 抽象工厂模式(Abstract Factory)

场景:跨平台UI组件库
优点:确保产品兼容性
缺点:扩展新产品困难

class Button(ABC):@abstractmethoddef render(self): passclass WindowsButton(Button):def render(self): print("Windows风格按钮")class MacButton(Button):def render(self): print("Mac风格按钮")class GUIFactory(ABC):@abstractmethoddef create_button(self): passclass WindowsFactory(GUIFactory):def create_button(self): return WindowsButton()class MacFactory(GUIFactory):def create_button(self): return MacButton()# 正面示例
def create_ui(os_type):factory = WindowsFactory() if os_type == "windows" else MacFactory()button = factory.create_button()button.render()  # 自动匹配操作系统风格# 反面示例(平台相关代码分散)
if os_type == "windows":button = WindowsButton()
elif os_type == "mac":button = MacButton()
button.render()
# 添加新平台需修改多处条件判断

4. 建造者模式(Builder)

场景:复杂对象创建(如SQL查询)
优点:分离构造过程与表示
缺点:增加额外Builder类


class SQLQuery:def __init__(self):self.table = ""self.fields = []self.where_clauses = []def execute(self):fields = ", ".join(self.fields) or "*"where = (" WHERE " + " AND ".join(self.where_clauses)) if self.where_clauses else ""print(f"SELECT {fields} FROM {self.table}{where}")class QueryBuilder:def __init__(self):self.query = SQLQuery()def select(self, *fields):self.query.fields = fieldsreturn selfdef from_table(self, table):self.query.table = tablereturn selfdef where(self, condition):self.query.where_clauses.append(condition)return selfdef build(self):return self.query# 正面示例
query = (QueryBuilder().select("id", "name").from_table("users").where("age > 18").build())
query.execute()# 反面示例(构造参数爆炸)
class BadQuery:def __init__(self, table, fields=None, where=None, joins=None, group_by=None):# 参数过多难以维护self.table = tableself.fields = fields or []self.where = where or []# ...更多参数

5. 原型模式(Prototype)

场景:游戏对象克隆、配置模板
优点:避免重复初始化开销
缺点:深拷贝可能复杂


import copyclass NPC:def __init__(self, name, health, position):self.name = nameself.health = healthself.position = position# 模拟昂贵初始化print(f"创建NPC {name}(耗时操作)")def clone(self):return copy.deepcopy(self)# 正面示例
orc_template = NPC("兽人", 100, (0, 0))
orc1 = orc_template.clone()  # 快速克隆
orc1.position = (10, 5)# 反面示例(重复初始化)
orc2 = NPC("兽人", 100, (0, 0))  # 重复执行昂贵初始化

二、结构型模式(6种)

6. 适配器模式(Adapter)

场景:整合第三方库、旧系统接口改造
优点:解决接口不兼容问题
缺点:增加额外层


class LegacyLogger:def log_message(self, msg, priority):print(f"[{priority}] {msg}")class ModernLogger:def log(self, message, level="INFO"):print(f"{level}: {message}")class LoggerAdapter:def __init__(self, logger):self.logger = loggerdef log(self, message, level="INFO"):if isinstance(self.logger, LegacyLogger):# 转换接口priority = 1 if level == "ERROR" else 0self.logger.log_message(message, priority)else:self.logger.log(message, level)# 正面示例
legacy = LoggerAdapter(LegacyLogger())
legacy.log("系统错误", level="ERROR")  # 自动转换接口# 反面示例(直接修改第三方库)
# 修改LegacyLogger源码使其兼容ModernLogger接口 → 违反开闭原则

7. 装饰器模式(Decorator)

场景:功能扩展(日志、缓存、权限)
优点:动态添加功能,符合开闭原则
缺点:多层装饰可读性下降
框架应用:Flask路由装饰器 @app.route


def log_execution(func):def wrapper(*args, **kwargs):print(f"执行: {func.__name__}")return func(*args, **kwargs)return wrapperdef cache_result(func):cache = {}def wrapper(*args):if args in cache:print("返回缓存结果")return cache[args]result = func(*args)cache[args] = resultreturn resultreturn wrapper@log_execution
@cache_result
def fibonacci(n):if n <= 1: return nreturn fibonacci(n-1) + fibonacci(n-2)# 正面示例
print(fibonacci(10))  # 带日志和缓存# 反面示例(硬编码功能)
def bad_fibonacci(n):print(f"执行: bad_fibonacci")  # 日志硬编码# ...实现+缓存逻辑混合...

8. 代理模式(Proxy)

场景:延迟加载、访问控制
优点:控制对象访问,实现懒加载
缺点:增加响应时间


class HighResImage:def __init__(self, filename):self.filename = filenameself._load_image()def _load_image(self):print(f"加载高清图片: {self.filename}(耗时操作)")def display(self): print(f"显示: {self.filename}")class ImageProxy:def __init__(self, filename):self.filename = filenameself._real_image = Nonedef display(self):if not self._real_image:self._real_image = HighResImage(self.filename)self._real_image.display()# 正面示例
gallery = [ImageProxy(f"image{i}.jpg") for i in range(3)]
gallery[0].display()  # 仅加载第一张# 反面示例(提前加载所有资源)
images = [HighResImage(f"image{i}.jpg") for i in range(3)]  # 启动时全部加载

9. 外观模式(Facade)

场景:简化复杂子系统调用
优点:提供统一接口,降低耦合
缺点:可能成为"上帝对象"


class CPU:def process(self): print("CPU处理数据")class Memory:def load(self): print("内存加载数据")class HardDrive:def read(self): print("硬盘读取数据")class Computer:def __init__(self):self.cpu = CPU()self.memory = Memory()self.hd = HardDrive()def start(self):self.hd.read()self.memory.load()self.cpu.process()# 正面示例
pc = Computer()
pc.start()  # 简单调用接口# 反面示例(客户端直接调用子系统)
hd = HardDrive()
mem = Memory()
cpu = CPU()
hd.read()
mem.load()
cpu.process()  # 客户端需了解所有细节

10. 享元模式(Flyweight)

场景:文本编辑器字符格式
优点:大幅减少内存使用
缺点:增加代码复杂度


class CharacterStyle:_cache = {}def __new__(cls, font, size, color):key = (font, size, color)if key not in cls._cache:cls._cache[key] = super().__new__(cls)cls._cache[key].font = fontcls._cache[key].size = sizecls._cache[key].color = colorreturn cls._cache[key]class Document:def __init__(self):self.chars = []def add_char(self, char, font, size, color):style = CharacterStyle(font, size, color)self.chars.append((char, style))def render(self):for char, style in self.chars:print(f"渲染 '{char}' 使用 {style.font}")# 正面示例(1000个字符只创建2种样式)
doc = Document()
for _ in range(500):doc.add_char('A', "Arial", 12, "black")
for _ in range(500):doc.add_char('B', "Times", 14, "blue")
print(f"样式实例数: {len(CharacterStyle._cache)}")  # 2# 反面示例(重复创建样式)
class BadChar:def __init__(self, char, font, size, color):self.char = charself.font = font# 每个字符独立存储样式 → 内存浪费

三、行为型模式(7种)

11. 观察者模式(Observer)

场景:事件通知、消息订阅
优点:解耦发布者和订阅者
缺点:意外更新链
框架应用:Django Signals


class Newsletter:def __init__(self):self.subscribers = []def subscribe(self, subscriber):self.subscribers.append(subscriber)def unsubscribe(self, subscriber):self.subscribers.remove(subscriber)def publish(self, news):print(f"发布新闻: {news}")for sub in self.subscribers:sub.notify(news)class Subscriber:def notify(self, news):print(f"{self.name} 收到: {news}")class EmailSubscriber(Subscriber):def __init__(self, name):self.name = f"邮箱用户-{name}"class AppSubscriber(Subscriber):def __init__(self, name):self.name = f"APP用户-{name}"# 正面示例
newsletter = Newsletter()
newsletter.subscribe(EmailSubscriber("张三"))
newsletter.subscribe(AppSubscriber("李四"))
newsletter.publish("Python 3.12发布")# 反面示例(紧耦合)
class BadNewsletter:def publish(self, news):print(f"发布新闻: {news}")# 直接调用具体方法EmailSubscriber("张三").notify(news)AppSubscriber("李四").notify(news)

12. 策略模式(Strategy)

场景:支付方式选择、排序算法
优点:运行时切换算法
缺点:客户端需了解不同策略


class CompressionStrategy(ABC):@abstractmethoddef compress(self, file): passclass ZipStrategy(CompressionStrategy):def compress(self, file):print(f"ZIP压缩 {file}(压缩率高)")class RarStrategy(CompressionStrategy):def compress(self, file):print(f"RAR压缩 {file}(加密支持)")class Compressor:def __init__(self, strategy=None):self.strategy = strategy or ZipStrategy()def set_strategy(self, strategy):self.strategy = strategydef compress_file(self, file):self.strategy.compress(file)# 正面示例
compressor = Compressor()
compressor.compress_file("data.txt")compressor.set_strategy(RarStrategy())
compressor.compress_file("data.txt")  # 动态切换算法# 反面示例(条件分支判断)
class BadCompressor:def compress(self, file, method="zip"):if method == "zip":print(f"ZIP压缩 {file}")elif method == "rar":print(f"RAR压缩 {file}")# 添加新算法需修改源码

13. 模板方法模式(Template Method)

场景:算法框架定义
优点:代码复用,扩展性好
缺点:可能限制灵活性
框架应用:Django类视图 View.dispatch()


class ReportGenerator(ABC):def generate(self):self.collect_data()self.process_data()self.export()@abstractmethoddef collect_data(self): passdef process_data(self):print("通用数据处理")@abstractmethoddef export(self): passclass PDFReport(ReportGenerator):def collect_data(self):print("收集PDF数据")def export(self):print("导出PDF文档")class ExcelReport(ReportGenerator):def collect_data(self):print("收集Excel数据")def process_data(self):print("自定义Excel数据处理")def export(self):print("导出Excel文件")# 正面示例
pdf = PDFReport()
pdf.generate()  # 复用通用流程# 反面示例(重复代码)
class BadPDFReport:def generate(self):print("收集PDF数据")print("通用数据处理")  # 重复代码print("导出PDF文档")class BadExcelReport:def generate(self):print("收集Excel数据")print("通用数据处理")  # 重复代码print("导出Excel文件")

14. 责任链模式(Chain of Responsibility)

场景:请求处理管道、中间件
优点:动态添加处理者
缺点:请求可能未处理
框架应用:Django中间件系统


class Handler(ABC):def __init__(self, successor=None):self.successor = successordef handle(self, request):if self.can_handle(request):return self.process(request)elif self.successor:return self.successor.handle(request)raise Exception("无法处理请求")@abstractmethoddef can_handle(self, request): pass@abstractmethoddef process(self, request): passclass AuthHandler(Handler):def can_handle(self, request):return "auth" in requestdef process(self, request):print("身份验证通过")class LogHandler(Handler):def can_handle(self, request):return True  # 最终处理器def process(self, request):print(f"记录请求: {request}")# 正面示例
pipeline = AuthHandler(LogHandler())
pipeline.handle({"action": "login", "auth": "token"})# 反面示例(巨型处理函数)
def bad_handler(request):if "auth" in request:print("身份验证通过")# ...其他条件分支...print(f"记录请求: {request}")  # 所有逻辑耦合

15. 命令模式(Command)

场景:GUI操作、事务管理
优点:解耦调用者和接收者
缺点:增加命令类数量


class Light:def on(self): print("开灯")def off(self): print("关灯")class Command(ABC):@abstractmethoddef execute(self): passclass LightOnCommand(Command):def __init__(self, light):self.light = lightdef execute(self):self.light.on()class LightOffCommand(Command):def __init__(self, light):self.light = lightdef execute(self):self.light.off()class RemoteControl:def __init__(self):self.history = []def execute_command(self, command):command.execute()self.history.append(command)def undo(self):if self.history:last = self.history.pop()print("撤销操作: ", end="")last.execute()  # 简化:实际需实现反向操作# 正面示例
light = Light()
remote = RemoteControl()
remote.execute_command(LightOnCommand(light))
remote.undo()  # 支持撤销# 反面示例(直接调用)
light.on()  # 无法记录历史,不支持撤销

16. 状态模式(State)

场景:订单状态流转、游戏角色状态
优点:简化状态转换逻辑
缺点:增加状态类数量


class OrderState(ABC):@abstractmethoddef next(self, order): pass@abstractmethoddef prev(self, order): passclass PendingState(OrderState):def next(self, order):order.state = PaidState()def prev(self, order):print("已是初始状态")class PaidState(OrderState):def next(self, order):order.state = ShippedState()def prev(self, order):order.state = PendingState()class Order:def __init__(self):self.state = PendingState()def next_state(self):print("转到下一状态")self.state.next(self)def __str__(self):return type(self.state).__name__# 正面示例
order = Order()
print(order)  # PendingState
order.next_state()
print(order)  # PaidState# 反面示例(状态标志+条件分支)
class BadOrder:def __init__(self):self.status = "pending"def next_state(self):if self.status == "pending":self.status = "paid"elif self.status == "paid":self.status = "shipped"# 状态逻辑分散在各处

四、Python设计模式深度洞察

1.动态语言特性:Python的鸭子类型减少了对工厂模式的需求2.装饰器内置支持:@decorator语法是装饰器模式的语法糖3.模式混合使用:实际项目中常组合多种模式(如Observer + Command)4.框架设计启示:Django使用Template Method定义视图生命周期Flask通过Decorator实现路由注册SQLAlchemy的Session使用Proxy模式

五、为什么需要设计模式?—— 未使用模式的代价

问题场景无模式方案后果适用模式
全局配置管理多个独立配置对象配置不一致,资源浪费单例模式
多支付网关支持if/else硬编码添加新网关需修改核心逻辑策略模式
跨平台UI开发平台相关代码分散维护困难,兼容性问题抽象工厂
复杂对象构造超长构造函数参数混乱,构造逻辑复杂建造者模式
事件通知系统直接调用接收方紧耦合,难以扩展新接收方观察者模式

相关文章:

Python设计模式终极指南:18种模式详解+正反案例对比+框架源码剖析

下面我将全面解析18种Python设计模式&#xff0c;每种模式都包含实际应用场景、优缺点分析、框架引用案例、可运行代码示例以及正反案例对比&#xff0c;帮助您深入理解设计模式的价值。 一、创建型模式&#xff08;5种&#xff09; 1. 单例模式&#xff08;Singleton&#x…...

第1章: 伯努利模型的极大似然估计与贝叶斯估计

伯努利模型的极大似然估计与贝叶斯估计 import numpy as np import matplotlib.pyplot as plt from scipy.stats import beta, bernoulli from scipy.optimize import minimize_scalar# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] # 使用黑体 plt.rcParams[axes.…...

IPv4编址及IPv4路由基础

一、实验目的 掌握接口 IPv4 地址的配置方法理解 LoopBack 接口的作用与含义理解直连路由的产生原则掌握静态路由的配置方法并理解其生效的条件掌握通过 PING 工具测试网络层连通性掌握并理解特殊静态路由的配置方法与应用场景 二、实验环境 安装有eNSP模拟器的PC一台&#…...

基于Python的机动车辆推荐及预测分析系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

SpringBoot扩展——发送邮件!

发送邮件 在日常工作和生活中经常会用到电子邮件。例如&#xff0c;当注册一个新账户时&#xff0c;系统会自动给注册邮箱发送一封激活邮件&#xff0c;通过邮件找回密码&#xff0c;自动批量发送活动信息等。邮箱的使用基本包括这几步&#xff1a;先打开浏览器并登录邮箱&…...

啊啊啊啊啊啊啊啊code

前序遍历和中序遍历构建二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNod…...

不同程度多径效应影响下的无线通信网络电磁信号仿真数据生成程序

生成.mat数据&#xff1a; %创建时间&#xff1a;2025年6月19日 %zhouzhichao %遍历生成不同程度多径效应影响的无线通信网络拓扑推理数据用于测试close all clearsnr 40; n 30;dataset_n 100;for bias 0.1:0.1:0.9nodes_P ones(n,1);Sampling_M 3000;%获取一帧信号及对…...

C语言学习day17-----位运算

目录 1.位运算 1.1基础知识 1.1.1定义 1.1.2用途 1.1.3软件控制硬件 1.2运算符 1.2.1与 & 1.2.2或 | 1.2.3非 ~ 1.2.4异或 ^ 1.2.5左移 << 1.2.6右移 >> 1.2.7代码实现 1.2.8置0 1.2.9置1 1.2.10不借助第三方变量&#xff0c;实现两个数的交换…...

Spring MVC参数绑定终极手册:单多参对象集合JSON文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以…...

宽度优先遍历(bfs)(2)——fllodfill算法

欢迎来到博主的专栏&#xff1a;算法解析 博主ID&#xff1a;代码小豪 文章目录 floodfiil算法leetcode733——图像渲染题目解析算法原理题解代码 leetcode130——被围绕的区域题目解析算法原理题解代码 floodfiil算法 floodfill算法&#xff0c;在博主这里看来则是一个区域填…...

嵌入式编译工具链熟悉与游戏移植

一、Linux 系统编译工具链使用与 mininim 源码编译 在 Ubuntu 系统上编译 mininim 开源游戏需要正确配置编译工具链和依赖库。以下是详细的操作步骤和故障解决方法&#xff1a; 1. 环境准备与源码获取 首先需要安装必要的编译工具和依赖库&#xff1a; # 更新系统软件包索引…...

STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议

STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议&#xff0c;主要用于帮助位于网络地址转换 (NAT) 设备&#xff08;如路由器&#xff09;后面的客户端发现自己的公共 IP 地址和端口号。这对于建立点对点 (P2P) 通信至关重要&#xff0c;尤其是在 VoIP&#…...

Transformer结构介绍

[编码器 Encoder] ←→ [解码器 Decoder] 编码器&#xff1a; 输入&#xff1a;源语言序列输出&#xff1a;每个词的上下文表示(embedding) 解码器&#xff1a;输入&#xff1a;目标语言序列编码器输出输出&#xff1a;下一个词的概率分布&#xff08;目标句子生成&#xff09…...

SpringBoot扩展——应用Web Service!

应用Web Service Web Service是一个SOA&#xff08;面向服务的编程&#xff09;架构&#xff0c;这种架构不依赖于语言&#xff0c;不依赖于平台&#xff0c;可以在不同的语言之间相互调用&#xff0c;通过Internet实现基于HTTP的网络应用间的交互调用。Web Service是一个可以…...

5G核心网周期性注册更新机制:信令流程与字段解析

一、周期性注册更新的技术背景与流程概述 1.1 注册更新的核心目的 在5G网络中,UE通过周期性注册更新维持与核心网的连接状态,主要作用包括: 状态保活:避免AMF因超时而释放UE上下文(T3512定时器超时前需完成更新);位置更新:通知网络UE的当前位置,确保寻呼可达;能力同…...

【LLM学习笔记3】搭建基于chatgpt的问答系统(下)

目录 一、检查结果检查有害内容检查是否符合产品信息 二、搭建一个简单的问答系统三、评估输出1.当存在一个简单的正确答案2.当不存在一个简单的正确答案 一、检查结果 本章将引领你了解如何评估系统生成的输出。在任何场景中&#xff0c;无论是自动化流程还是其他环境&#x…...

算法导论第十九章 并行算法:解锁计算新维度

第十九章 并行算法&#xff1a;解锁计算新维度 “并行计算不是未来&#xff0c;而是现在。” —— David Patterson 在单核性能增长放缓的时代&#xff0c;并行算法成为突破计算极限的关键。本章将带你探索多核处理器、分布式系统和GPU加速的奇妙世界&#xff0c;揭示如何通过协…...

Python 数据分析与可视化 Day 1 - Pandas 数据分析基础入门

&#x1f3af; 今日目标 理解 Pandas 的作用和核心概念学会创建 Series 和 DataFrame掌握基本数据读取&#xff08;CSV&#xff09;与常用查看方法 &#x1f9f0; 1. 什么是 Pandas&#xff1f; Pandas 是基于 NumPy 的强大数据分析库&#xff0c;提供了灵活的表格数据结构 Da…...

【数字人开发】Unity+百度智能云平台实现长短文本个性化语音生成功能

一、创建自己的应用 百度智能云控制台网址&#xff1a;https://console.bce.baidu.com/ 1、创建应用 2、获取APIKey和SecretKey 3、Api调试 调试网址&#xff1a;https://console.bce.baidu.com/support/?timestamp1750317430400#/api?productAI&project%E8%AF%AD%E9%…...

(哈希)128. 最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff…...

MFC中使用CRichEditCtrl控件让文本框中的内容部分加粗

MFC中文本框控件的内容&#xff0c;设置好字体格式后&#xff0c;只能单一的显示&#xff0c;如果相对文本框的内容部分加粗&#xff0c;或者部分加颜色、链接等都无法实现&#xff0c;但MFC中提供了CRichEditCtrl控件&#xff0c;就很方便的实现文本框中部分内容需要特殊处理的…...

Redis 的优势有哪些,它是CP 还是 AP?CAP 理论又是什么?

Redis的核心优势 Redis作为当今最流行的内存数据库之一&#xff0c;具有以下显著优势&#xff1a; 1. 卓越的性能表现 内存存储&#xff1a;数据主要存储在内存中&#xff0c;读写速度极快&#xff08;10万 QPS&#xff09;单线程架构&#xff1a;避免多线程竞争&#xff0c…...

flink的多种部署模式

## 部署模式和运行模式 ### 部署模式 - 本地local - 单机无需分布式资源管理 - 集群 - 独立集群standalone - 需要flink自身的任务管理工具 - jobmanager接收和调度任务 - taskmanager执行 - on其他资源管理工具yarn/k8s …...

SQL分片工具类

SQL分片工具类(SqlShardingUtil)提供数据库查询的智能分片功能&#xff0c;支持数字和字符串两种字段类型的分片策略。对于数字字段&#xff0c;可以指定分片数量均匀划分数值区间&#xff1b;对于字符串字段&#xff0c;则按照ASCII字符范围自动划分。工具类确保分片后的SQL语…...

死锁相关知识

死锁是什么 死锁&#xff08;Deadlock&#xff09;是指两个或多个进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;因为互相等待对方释放资源&#xff0c;导致永远无法继续执行的状态。 ✅ 死锁的形成条件&#xff08;必须同时满足以下四个&#xff09;&#xff1…...

oscp靶机练习PG Reconstruction

枚举阶段 nmap -A -T4 -p- -Pn -n 192.168.217.103 发现ftp&#xff0c;进行连接枚举 都下载到本地 这里提示我们两点&#xff0c;可以看看pcap文件&#xff0c;还有就是可能有密码遗留还没有删除。 使用下面命令进行过滤筛选流量包&#xff0c;查看与密码相关 http.reque…...

写题。贪心题组

一、 解题思路&#xff1a;主要还是写出val / m&#xff0c;按这个排序&#xff0c;就行了 #include<bits/stdc.h> #define endl "\n" #define ll long long #define pii pair<int,int> using namespace std;struct doro {int m, val;double cmp; } arr…...

UE官方文档学习 TAarry 查询

这个很简单经常用。 二.GetData() . GetData()&#xff0c;像C里拿到数组首地址一样。它不具有越界保护机制&#xff0c;StrArr拥有越界保护机制。这个地址在数组不做改变&#xff0c;如扩容等有用。 void AWXArrayActor::WXFindArray() {TArray<FString> StrArr { &q…...

使用Haproxy搭建Web群集

LVS负载均衡群集 Haproxy介绍http请求负载均衡常用调度算法常见的web群集调度器 示例操作安装httpd&#xff08;两台网站服务器操作一致&#xff09;编译安装haproxyhaproxy服务器配置(1)建立haproxy的配置文件(2)修改haproxy.cfg配置文件 测试haproxy的日志(1)修改 haproxy 配…...

Linux 基础命令:`ls`、`cd`、`du` 快速入门

在 Linux 系统中&#xff0c;ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls&#xff1a;查看目录内容 用途&#xff1a;列出当前或指定目录下的文件和子目录。 常用命令&#xff1a; ls -l # 详细列表&#xff08;权限、大…...

[论文阅读] 人工智能 + 软件工程 | USEagent:迈向统一的AI软件工程师

论文信息 article{applis2025unified,title{Unified Software Engineering agent as AI Software Engineer},author{Applis, Leonhard and Jiang, Nan and Zhang, Yuntong and Tan, Lin and Liang, Shanchao and Roychoudhury, Abhik},journal{arXiv preprint arXiv:2506.1468…...

微信小程序传参过来了,但是数据没有获取到

使用本方法前&#xff0c;已经采用encodeURIComponent把拼接的参数编码之后&#xff0c;拼接在链接上&#xff0c;在接受的页面的onLoad生命周期&#xff0c;接收到参数之后&#xff0c;采用decodeURIComponent进行解码的操作&#xff0c;如果这个也不行&#xff0c;不是说不行…...

微信小程序form表单手机号正则检验pattern失效

好奇怪啊&#xff0c;h5页面校验没问题&#xff0c;在微信小程序模拟器以及真机运行都失效&#xff0c;排查半天&#xff0c;记录一下 PS&#xff1a;身份证号校验也没问题&#xff0c;就手机号校验有问题&#xff0c;奇奇怪怪的 之前的写法&#xff08;在小程序上不生效&…...

repo 工具

repo 是 Google 为管理多个 Git 仓库而开发的工具&#xff0c;主要用于 Android 开源项目&#xff08;AOSP&#xff09;等大型项目。它通过清单文件&#xff08;manifest.xml&#xff09;统一管理多个 Git 仓库的依赖关系。以下是核心用法和常见命令&#xff1a; 一、安装 repo…...

Python实例题:基于 TensorFlow 的图像识别与分类系统

目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于 TensorFlow 的图像识别与分类系统 问题描述 开发一个基于 TensorFlow 的图像识别与分类系统&#xff0c;包含以下功能&#xff1a; 图像分类模型&#xff1a;基于…...

Windows 10开始菜单优化方案,如何实现Win7风格开始菜单的还原

今天阿灿给大家安利个好东西 Start10这软件能让Win10的开始菜单变回Win7那种经典样式&#xff0c;用起来特别顺手。不仅能改开始菜单外观&#xff0c;还能调整任务栏布局&#xff0c;想怎么设置都行。 我用它主要就图两点&#xff1a; 1. 找回Win7那种简洁好用的开始菜单 2.…...

Kafka性能压测报告撰写

在大数据生态体系中&#xff0c;Kafka以其卓越的高吞吐、低延迟特性&#xff0c;成为消息队列领域的中流砥柱。然而&#xff0c;随着业务规模不断扩张&#xff0c;数据流量日益激增&#xff0c;Kafka的性能表现直接关乎业务系统的稳定运行与效率提升。通过科学严谨的性能压测&a…...

IP 地理库的使用指南:从基础应用到深度实践​

P 地理库的使用指南&#xff1a;从基础应用到深度实践​ ​ 在数字化时代&#xff0c;IP 地址如同网络世界里的 “门牌号码”&#xff0c;而 IP 地理库则是解读这些号码背后秘密的 “解码器”。它不仅能定位 IP 对应的地理位置&#xff0c;还能挖掘出丰富的网络属性信息。接下来…...

C#的泛型和匿名类型

一、C#的泛型简介 泛型是一种允许你延迟编写类或方法中的数据类型规范&#xff0c;直到你在实际使用时才替换为具体的数据类型【简单的说&#xff1a;泛型就是允许我们编写能够适用于任何数据类型的代码&#xff0c;而无需为每种特定类型重写相同的代码】(T是类型参数&#xff…...

ABP VNext + MongoDB 数据存储:多模型支持与 NoSQL 扩展

&#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09; 目录 &#x1f680; ABP VNext MongoDB 数据存储&#xff1a;多模型支持与 NoSQL 扩展&#xff08;生产级实践&#xff09;&#x1f3af; 引言&#x1f9f0…...

JETBRAINS IDE 开发环境自定义设置快捷键

Date: 2025-06-18 20:39:52 author: lijianzhan JetBrains简介 让它发生。 用代码。 在JetBrains&#xff0c;代码是我们的激情所在。自成立以来&#xff0c;我们一直致力于打造世界上最强大、最有效的开发工具。 1.JETBRAINS官网&#xff0c;可以在官网下载代码编辑器 2.进入…...

JAVA——泛型

泛型&#xff08;Generics&#xff09;是Java语言在JDK 5.0版本中引入的一种强大特性&#xff0c;用于在编译时提供更强的类型检查和类型安全。它允许程序员在定义类、接口和方法时使用类型参数&#xff08;Type Parameters&#xff09;&#xff0c;从而实现类型参数化。通过泛…...

攻防演练:1.木马后门文件演练

为了防止 Linux 服务器上传木马后门文件&#xff0c;可以编写一个脚本&#xff0c;定期检查系统中的可疑文件、进程和权限。以下是一个示例脚本&#xff0c;用于检查常见的后门文件、异常进程和权限问题。 脚本功能 检查常见后门文件路径。检查异常 SUID/SGID 文件。检查异常进…...

c++ STL---vector使用

本文对STL---中的vector的使用是参考网站 vector - C Reference 的内容&#xff0c;该网站是外文的哦&#xff0c;大家可以尝试打开看看更深刻的理解。本文是抽取其中常使用&#xff0c;然后加上自己的是理解哦。 前言 vector其实是顺序表类模板的封装啊&#xff01; 数据结构…...

windows标题栏显示奇怪的蓝色,怎么解决

背景 如下&#xff0c;非常奇怪&#xff0c;如果窗口是active状态就是蓝色的&#xff0c;为什么&#xff1f; 如果你遇到上述问题&#xff0c;可以这么解决&#xff1a; 右键点击桌面&#xff0c;选择 “个性化”&#xff0c; 滚动到下面&#xff0c;看到 “标题栏和窗口边…...

Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘

引言 在分布式消息系统领域&#xff0c;Kafka凭借卓越的性能与高可靠性占据重要地位&#xff0c;而这一切都离不开其精妙的存储设计。从消息的持久化存储到高效检索&#xff0c;从日志分段管理到数据清理策略&#xff0c;Kafka的存储架构设计巧妙&#xff0c;能够支撑海量消息…...

将多个Excel合并到一个Excel中的方法

今天遇到这么一个问题&#xff0c;需要将多个Excel表格中的数据汇总表&#xff0c;合并在一个Excel中&#xff0c;并且显示一致。 因此编写了以下代码来解决这个问题&#xff0c; 1.在Excel中按AltF11&#xff0c;快速调出命令控制台 2.工具栏选择插入——模块——将以下脚本…...

Debian配置Redis主从、哨兵

前言 Redis的下载安装可参考Centos安装配置Redis6.x&#xff0c;Centos和Debian的步骤基本类似&#xff0c;或自行在网上搜索相关资料 注意&#xff1a;远程连接需放开相应端口 主从 搭建一个一主二从的主从模式 处理conf文件 #进入redis所在目录 cd /tools/redis/redis6 …...

OpenSSL引擎 + PKCS11 + SoftHSM2认证

OpenSSL引擎 PKCS11 SoftHSM2 前言&#xff1a;金融级安全的基石 在金融、军工等高安全领域&#xff0c;硬件安全模块&#xff08;HSM&#xff09; 是保护加密密钥的黄金标准。本文将深度剖析HSM核心组件libpkcs11.so的工作原理&#xff0c;并手把手教你搭建基于SoftHSM2的…...

flex布局 项目属性

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>flex布局 项目属性</title> <link href"css/k.css" rel"stylesheet" /> </head> <bod…...