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

设计模式大全

1. 策略模式

什么是策略模式?

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。通过使用策略模式,可以在运行时选择不同的算法,而无需修改上下文代码。

策略模式的组成部分

策略模式主要由以下几个部分组成:

  1. 策略接口(Strategy Interface):定义了所有支持的算法的公共接口。
  2. 具体策略(Concrete Strategy):实现了策略接口的具体算法。
  3. 上下文(Context):维护一个对策略对象的引用,并在需要时调用策略对象的方法。

策略模式的优点

  1. 开闭原则:可以在不修改现有代码的情况下引入新的算法,符合开闭原则(OCP)。
  2. 避免条件语句:通过使用策略模式,可以避免在客户端代码中使用大量的条件语句来选择不同的算法。
  3. 提高灵活性:可以在运行时选择不同的算法,提高了代码的灵活性和可扩展性。

策略模式的缺点

  1. 增加类的数量:每个具体策略都需要一个类,这可能会增加类的数量,导致代码复杂性增加。
  2. 客户端必须知道所有策略:客户端必须知道所有的策略类,并自行决定使用哪一个策略,这增加了客户端的复杂性。

策略模式的示例

假设我们有一个支付系统,支持多种支付方式(如信用卡支付、PayPal 支付和比特币支付)。我们可以使用策略模式来实现不同的支付方式。

在这里插入图片描述

from abc import ABC, abstractmethodclass PaymentStrategy(ABC):@abstractmethoddef pay(self, amount):passclass CreditCardPayment(PaymentStrategy):def __init__(self, card_number, card_expiry, card_cvv):self.card_number = card_numberself.card_expiry = card_expiryself.card_cvv = card_cvvdef pay(self, amount):print(f"Paying {amount} using Credit Card ending with {self.card_number[-4:]}")class PayPalPayment(PaymentStrategy):def __init__(self, email):self.email = emaildef pay(self, amount):print(f"Paying {amount} using PayPal account {self.email}")class BitcoinPayment(PaymentStrategy):def __init__(self, wallet_address):self.wallet_address = wallet_addressdef pay(self, amount):print(f"Paying {amount} using Bitcoin wallet {self.wallet_address}")class PaymentContext:def __init__(self, strategy: PaymentStrategy):self.strategy = strategydef set_strategy(self, strategy: PaymentStrategy):self.strategy = strategydef pay(self, amount):self.strategy.pay(amount)if __name__ == "__main__":# 使用信用卡支付credit_card_payment = CreditCardPayment("1234567890123456", "12/23", "123")context = PaymentContext(credit_card_payment)context.pay(100)# 切换到 PayPal 支付paypal_payment = PayPalPayment("user@example.com")context.set_strategy(paypal_payment)context.pay(200)# 切换到比特币支付bitcoin_payment = BitcoinPayment("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa")context.set_strategy(bitcoin_payment)context.pay(300)# 运行结果
# Paying 100 using Credit Card ending with 3456
# Paying 200 using PayPal account user@example.com
# Paying 300 using Bitcoin wallet 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

2. 代理模式

什么是代理模式?

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理,以控制对这个对象的访问。代理模式可以用于延迟加载、访问控制、日志记录等场景。通过使用代理模式,可以在不修改原始对象的情况下,添加额外的功能或控制。

代理模式的组成部分

  1. 接口(Interface):定义了代理类和实际类的公共接口。
  2. 实际类(Real Subject):实现了接口,包含了实际的业务逻辑。
  3. 代理类(Proxy):实现了接口,控制对实际类的访问,并可以在访问实际类之前或之后添加额外的功能。

代理模式的优点

  1. 控制访问:代理模式可以控制对实际对象的访问,例如通过权限控制来限制某些用户的访问。
  2. 延迟加载:代理模式可以延迟实际对象的创建和初始化,直到真正需要使用它时才进行加载,从而提高性能。
  3. 日志记录:代理模式可以在访问实际对象之前或之后添加日志记录功能,方便调试和监控。

代理模式的缺点

  1. 增加复杂性:代理模式引入了额外的代理类,增加了系统的复杂性。
  2. 性能开销:代理模式可能会增加额外的性能开销,特别是在代理类中添加了复杂的逻辑时。

代理模式的示例

假设我们有一个图像查看器应用程序,它可以加载和显示图像。为了提高性能,我们可以使用代理模式来延迟加载图像,直到真正需要显示图像时才进行加载。

在这里插入图片描述

from abc import ABC, abstractmethodclass Image(ABC):@abstractmethoddef display(self):passclass RealImage(Image):def __init__(self, filename):self.filename = filenameself.load_image_from_disk()def load_image_from_disk(self):print(f"Loading image {self.filename} from disk...")def display(self):print(f"Displaying image {self.filename}")class ProxyImage(Image):def __init__(self, filename):self.filename = filenameself.real_image = Nonedef display(self):if self.real_image is None:self.real_image = RealImage(self.filename)self.real_image.display()if __name__ == "__main__":# 创建代理图像对象proxy_image = ProxyImage("test_image.jpg")# 图像尚未加载print("Image not loaded yet.")# 显示图像,触发图像加载proxy_image.display()# 再次显示图像,不会再次加载proxy_image.display()# 运行结果:
# Image not loaded yet.
# Loading image test_image.jpg from disk...
# Displaying image test_image.jpg
# Displaying image test_image.jpg

相关文章:

设计模式大全

1. 策略模式 什么是策略模式? 策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。通过使用策略…...

redis IO多路复用机制

目录 一、五种 I/O 模型 1.阻塞IO(Blocking IO) 2.非阻塞IO(Nonblocking IO) 3.IO多路复用(IO Multiplexing) 通知的方式 select模式 poll模式 epoll模式 4.信号驱动IO(Signal Driven …...

Oracle漏洞修复 19.3 补丁包 升级为19.22

1.场景描述 上周末2024-10-12日,服务器扫出漏洞,希望及时修复。其中,oracle的漏洞清单如下,总结了下,基本都是 Oracle Database Server 的 19.3 版本到 19.20 版本和 21.3 版本到 21.11 版本存在安全漏洞,即版本问题。如: Oracle Database Server 安全漏洞(CVE-2023-22…...

Q2=10 and Q2=1--PLB(Fig.4)

(个人学习笔记,仅供参考) import numpy as np from scipy.special import kv, erfc from scipy.integrate import dblquad import matplotlib.pyplot as plt import scipy.integrate as spi# Constants w 0.6198 g0_sq 21.5989 rho 0.782…...

sd卡挂载返回FR_NOT_READY等错误

前言 本文章主要是例举文件系统挂载sd卡时出现的一下问题总结。本人用的芯片是GDF103系列,最近项目要使用sd进行读取文件,因此查阅了资料进行开发。一开始是使用了SPI方式连接,例程是原子哥的stm32进行改的,但多次调试都是卡死在发…...

推荐一款超级实用的浏览器扩展程序!实时翻译网页,支持多种语言(带私活源码)

今天给大家分享的一款浏览器插件。 一、背景 在如今的信息时代,互联网已经成为了人们获取信息、交流和娱乐的重要平台,而随着全球化的不断深入和交流的加强,越来越多的人开始关注各国的文化、政治和经济,因此需要浏览不同语言的…...

manjaro kde 24 应该如何设置才能上网(2024-10-13亲测)

要在 Manjaro KDE 24 上设置网络连接,可以按照以下步骤进行设置,确保你能够连接到互联网: 是的,你可以尝试使用一个简单的自动修复脚本来解决 Manjaro KDE 中的网络连接问题。这个脚本将检查网络服务、重新启动 NetworkManager、…...

2024软件测试面试大全(答案+文档)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计,到…...

unity动态批处理

unity动态批处理 动态批处理要求和兼容性渲染管线兼容性 使用动态批处理网格的动态批处理限制动态生成几何体的动态批处理 动态批处理 动态批处理是一种绘制调用批处理方法,用于批处理移动的 GameObjects 以减少绘制调用。动态批处理在处理网格和 Unity 在运行时动…...

faust,一个神奇的 Python 库!

大家好,今天为大家分享一个神奇的 Python 库 - faust。 Github地址:https://github.com/robinhood/faust 在分布式系统和实时数据处理的世界里,消息流处理(Stream Processing)变得越来越重要。Faust 是一个 Python 库…...

electron本地OCR实现

使用tesseract.js - npm (npmjs.com) 官方demo&#xff1a;GitHub - Balearica/tesseract.js-electron: An example to use tesseract.js in electron 目录结构&#xff1a; // 引入 <script type"module" src"./ocr/tesseract.js"></script>…...

RK3588的demo板学习

表层的线宽是3.8mil: 换层之后线宽变成了4.2mil: (说明对于一根线&#xff0c;不同层线宽不同) 经典&#xff1a; 开窗加锡&#xff0c;增强散热&#xff0c;扩大电流&#xff1a; R14的作用&#xff1a;与LDO进行分压&#xff0c;降低LDOP的压差从而减小其散热&#xff1a;第…...

基于springboot驾校管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…...

关于Vue脚手架

一、简介与安装 1 简介 Vue Cli 全称Vue command line interface(Vue命令行接口)&#xff0c;俗称Vue脚手架&#xff0c; 是Vue官方提供的一个标准化开发工具(开发平台)。 可以帮助我们快速创建一个开发Vue项目的标准化基础架子。【集成了webpack配置】 参考官网&#xff1a…...

MySQL 指定字段排序

MySQL 中的 ORDER BY FIELD 用法详解 一、引言 在数据库查询中&#xff0c;排序是一个常见的需求。MySQL 提供了 ORDER BY 子句来对查询结果进行排序&#xff0c;其中 FIELD() 函数是一种非常巧妙且灵活的排序方式。通过 ORDER BY FIELD&#xff0c;可以按照指定的顺序对某个…...

Mysql—高可用集群MHA

1:什么是MHA&#xff1f; MHA&#xff08;Master High Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切…...

MeshGS: Adaptive Mesh-Aligned GaussianSplatting for High-Quality Rendering 论文解读

目录 一、概述 二、相关工作 1、神经渲染 2、基于Mesh的渲染 3、基于点的渲染和高斯溅射 三、前置知识 1、SDF 2、Marching Cubes算法 四、MeshGS 1、初始化Mesh网格 2、基于Mesh的GS溅射 3、损失函数 一、概述 提出一种基于距离的高斯splatting&#xff0c;并且将高…...

JDK-23与JavaFX的安装

一、JDK-23的安装 1.下载 JDK-23 官网直接下载&#xff0c;页面下如图&#xff1a; 2.安装 JDK-23 2.1、解压下载的文件 找到下载的 ZIP 文件&#xff0c;右键点击并选择“解压到指定文件夹”&#xff0c;将其解压缩到您希望的目录&#xff0c;例如 C:\Program Files\Java\…...

LeetCode讲解篇之2266. 统计打字方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用逆向思维发现如果连续按存在三个字母的按键&#xff0c;最后一个按键表示的字母可以是某个字母连续出现一次、两次、三次这三种情况的方案数之和 我们发现连续按存在三个字母的按键&#xff0c;当连续按…...

2025推荐选题|基于MVC的农业病虫害防治平台的设计与实现

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

重构手游操控体验:Escrcpy如何颠覆手机游戏交互范式

重构手游操控体验&#xff1a;Escrcpy如何颠覆手机游戏交互范式 【免费下载链接】escrcpy &#x1f4f1; Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 在移动游戏日益复杂的今天&…...

【FineBI】自定义地图制作全流程:从数据导入到可视化优化

1. 数据准备与导入&#xff1a;从Excel到FineBI的完美衔接 第一次用FineBI做自定义地图时&#xff0c;最让我头疼的就是数据导入环节。后来发现只要掌握几个关键点&#xff0c;整个过程能节省至少半小时。首先确保Excel数据表满足这三个条件&#xff1a;第一列必须是区域名称&a…...

惊艳效果!立知lychee-rerank-mm图文匹配案例分享,看看它有多准

惊艳效果&#xff01;立知lychee-rerank-mm图文匹配案例分享&#xff0c;看看它有多准 1. 为什么我们需要多模态重排序 在信息爆炸的时代&#xff0c;我们每天都会遇到这样的场景&#xff1a;搜索引擎返回几十个结果&#xff0c;但真正相关的可能只有两三个&#xff1b;电商平…...

HybridCLR的底层原理

HybridCLR&#xff08;原名huatuo&#xff09;是一个为Unity IL2CPP后端设计的原生C#热更新解决方案。它通过扩展Unity的IL2CPP运行时&#xff0c;将其从纯AOT&#xff08;提前编译&#xff09;模式改造为 “AOT 解释器”混合运行时&#xff0c;从而原生支持动态加载.NET程序集…...

Windows下Qt集成libcurl:从零搭建网络请求环境与实战验证

1. 为什么选择Qtlibcurl组合 在Windows平台开发带网络功能的Qt应用时&#xff0c;你可能纠结过该用QNetworkAccessManager还是第三方库。我做过十几个跨平台项目&#xff0c;实测下来libcurl有三大不可替代的优势&#xff1a; 首先是对HTTPS的完美支持。Qt自带的网络模块在Wi…...

别再折腾本地环境了!用Google Colab免费GPU跑通YOLOv8的保姆级教程

别再折腾本地环境了&#xff01;用Google Colab免费GPU跑通YOLOv8的保姆级教程 第一次接触YOLO目标检测模型时&#xff0c;我被它强大的实时检测能力震撼了——直到尝试在本地配置环境。CUDA版本冲突、PyTorch安装报错、显卡驱动不兼容...这些坑让我的热情迅速降温。直到发现G…...

戴森球计划工厂蓝图库:从零开始的效率倍增实战指南

戴森球计划工厂蓝图库&#xff1a;从零开始的效率倍增实战指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 在戴森球计划的浩瀚宇宙中&#xff0c;高效的工厂布局是实现…...

[开源]玄武门之变的多变量数学建模与C++模拟系统——从历史事件到量化分析

引言 公元626年7月2日&#xff0c;唐朝长安城玄武门发生了一场改变中国历史进程的流血政变。秦王李世民伏击太子李建成、齐王李元吉&#xff0c;最终登基为唐太宗&#xff0c;开创了贞观之治。这场“玄武门之变”涉及军事对抗、政治博弈、个人能力、时机把握等诸多复杂因素&am…...

前后端分离网站系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着互联网技术的快速发展&#xff0c;传统的前后端耦合架构在开发效率和维护成本上逐渐显现出局限性&#xff0c;前后端分离架构因其灵活性、可扩…...

RexUniNLU开源模型实战:400MB模型在A10/A100/T4不同GPU上的适配

RexUniNLU开源模型实战&#xff1a;400MB模型在A10/A100/T4不同GPU上的适配 1. 引言 你是否遇到过这样的困扰&#xff1a;想要使用强大的自然语言理解模型&#xff0c;但动辄几十GB的大模型让部署变得困难重重&#xff1f;或者你的GPU显存有限&#xff0c;无法运行那些"…...