【23种设计模式应用场景汇总】

23种设计模式应用场景汇总


23种设计模式

设计模式是一种在软件开发中解决特定问题的通用解决方案。下面我将尝试将23种设计模式融入到一个场景中:
假设我们正在开发一个在线购物系统,我们可以使用以下设计模式:

  • 1. 工厂方法模式:当用户在网站上下订单时,我们可以使用工厂方法模式来创建订单对象,根据用户选择的商品类型,使用不同的工厂来创建相应的订单对象。

分为:工厂模式分为:简单工厂、工厂方法、抽象工厂。
1、简单工厂通过参数决定创建哪个实例、
2、工厂方法将工厂、产品提出抽象接口、每一种产品对应一个工厂,最后根据用户的参数,使用不同的工厂创建不同的产品实例。
3、抽象工厂:是一个工厂创建一系列产品(比如windos上的GUI组件:windows版本的按钮、文本框、选择按钮等,是与linux或MacOs下的不同)。产品1(A系列产品1、B系列产品2),产品2(A系统产品2、B系列产品2),工厂(A系列工厂、B系列工厂),A工厂就会创建A系列产品1、A系列产品2;B工厂创建B系列产品1、B系列产品2.

  • 2. 单例模式:我们可以使用单例模式来确保系统中的购物车对象只有一个实例,以确保用户在整个会话期间都使用同一个购物车。

懒汉式和饿汉式。五种,最重要的是线程安全。

  • 3. 观察者模式:当用户下订单时,我们可以使用观察者模式通知库存管理系统和仓库系统更新库存。这样,一旦有商品被下单,其他系统就会及时得到通知。

观察者模式

  • 4. 策略模式:在计算订单总价时,我们可以根据用户的会员等级或者促销活动来选择不同的计价策略,这就是策略模式的应用。
  • 5. 适配器模式:当我们需要将外部支付f接口整合到系统中时,我们可能需要使用适配器模式来将外部接口适配成我们系统内部的统一接口。
  • 6. 装饰者模式:如果我们需要在订单中加入礼品包装、贺卡等功能,可以使用装饰者模式动态地为订单对象添加额外的功能。
  • 7. 命令模式:在处理用户的退货请求时,我们可以使用命令模式将用户的退货请求封装成命令对象,然后由相应的命令对象来执行具体的退货操作。
  • 8. 模板方法模式:在生成订单报告时,我们可以使用模板方法模式定义生成报告的流程,然后在具体的报告生成类中实现具体的步骤
  • 9. 原型模式:在系统中有一些商品是定制化的,我们可以使用原型模式来克隆商品对象,以便快速创建定制化商品的副本。
  • 10. 抽象工厂模式:如果我们的系统需要支持多个不同类型的支付方式(比如信用卡、支付宝、微信支付等),我们可以使用抽象工厂模式来创建不同支付方式的工厂,从而实现一个统一的支付接口。
  • 11. 建造者模式:当用户在网站上定制礼篮时,我们可以使用建造者模式来创建复杂的礼篮对象,将其构建过程与表示分离,使得构建过程可以创建不同的表示。
  • 12. 状态模式:在订单处理流程中,订单可能会经历多个状态(比如待支付、已支付、已发货、已签收等),我们可以使用状态模式来管理订单的状态转换,使状态转换更加清晰和可维护。
  • 13. 桥接模式:如果我们需要在不同的平台上展示商品信息(比如网站、移动端、微信小程序等),我们可以使用桥接模式将平台和商品信息的展示进行解耦,从而让它们可以独立地变化。
  • 14. 组合模式:在管理商品分类树的时候,我们可以使用组合模式来表示商品分类和子分类的层次结构,以便对整个分类树进行统一的操作。
  • 15. 迭代器模式:当需要遍历购物车中的商品列表时,我们可以使用迭代器模式来提供一种统一的方式来遍历不同类型的购物车。
  • 16. 访问者模式:如果需要对不同类型的商品进行不同的操作(比如打印、计算价格等),我们可以使用访问者模式来实现对商品的不同操作,而不需要修改商品类的代码。
  • 17. 备忘录模式:在用户进行购物车操作时,我们可以使用备忘录模式来保存购物车的状态,以便用户可以在需要时恢复到之前的状态。
  • 18. 解释器模式:如果我们需要实现一些复杂的促销规则或者查询条件,可以使用解释器模式来定义一个解释器,用于解释和执行这些规则或者条件。
  • 19. 中介者模式:当订单系统、库存系统和物流系统之间需要进行协作时,我们可以使用中介者模式来将它们的交互行为封装到中介者对象中,从而降低系统中各个对象之间的耦合度。
  • 20. 外观模式:当需要为客户端提供一个统一的接口来访问子系统中的一群接口时,可以使用外观模式来简化客户端与子系统之间的交互。
  • 21. 代理模式:在系统中,我们可以使用代理模式来控制对敏感信息的访问,比如用户的个人信息,可以通过代理对象来进行访问控制。
  • 22. 责任链模式:当系统中需要处理一系列的请求,并且每个请求可能由不同的处理者来处理时,可以使用责任链模式来实现请求的传递和处理。
  • 23. 享元模式:电商系统通常需要管理大量商品,每个商品可能有多个属性和规格(比如颜色、尺码等),而这些属性和规格可能是可以共享的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100 只出现一次的数字 位运算

Problem: 136. 只出现一次的数字 文章目录 思路复杂度Code 思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public int singleNumber(int[] nums) {int res 0;for(int x : nums)res ^ x;return res;} }

UI自动化测试框架

文章目录 UI自动化基础什么是UI自动化测试框架UI自动化测试框架的模式数据驱动测试框架关键字驱动测试框架行为驱动测试框架 UI自动化测试框架的作用UI自动化测试框架的核心思想UI自动化测试框架的步骤UI自动化测试框架的构成UtilsLog.javaReadProperties.Java coreBaseTest.ja…

【分布式技术】监控技术zabbix实操

目录 一、脚本监控nginx的连接状态 步骤一:做好nginx的配置 步骤二:完成监控数据脚本编写,并使用zabbix_get测试 步骤三:在zabbix agent配置目录中,编写以conf结尾的用户参数文件 步骤四:在zabbix web…

Python 网络编程之TCP详细讲解

【一】传输层 【1】概念 传输层是OSI五层模型中的第四层,负责在网络中的两个端系统之间提供数据传输服务主要协议包括**TCP(传输控制协议)和UDP(用户数据报协议)** 【2】功能 **端到端通信:**传输层负责…

HackerGPTWhiteRabbitNeo的使用及体验对比

1. 简介 WhiteRabbitNeo(https://www.whiterabbitneo.com/)是基于Meta的LLaMA 2模型进行特化的网络安全AI模型。通过专门的数据训练,它在理解和生成网络安全相关内容方面具有深入的专业能力,可广泛应用于教育、专业培训和安全研究…

MongoDB系统性能调优(持续更新)

cache_size 指定WT存储引擎内部cache的内存用量上限。 需要注意的是,仅作用于WiredTiger cache,而非mongod进程的内存用量上限。MongoDB同时使用WT cache和文件系统cache,往往mongod进程的内存用量高于该值。cache_size相对于物理内存总量不要…

聊聊PowerJob的TransportServiceAware

序 本文主要研究一下PowerJob的TransportServiceAware TransportServiceAware tech/powerjob/server/remote/aware/TransportServiceAware.java public interface TransportServiceAware extends PowerJobAware {void setTransportService(TransportService transportServi…

什么是非电离辐射与电离辐射?

摘要: 非电离辐射和电离辐射是两种不同类型的辐射,它们主要区别在于能量水平和与物质相互作用的方式。 非电离辐射 非电离辐射是指能量较低,不足以使原子或分子的电子脱离其原子核束缚而产生电离现象的电磁波。这类辐射不 ... 非电离辐射和电离辐射是两…

多角度俯瞰Python函数及作用

什么是函数 我们应该都学过三角函数吧,比如正弦函数,在最初接触到这方面的知识的时候,我们要求sin30是不是要去查一个叫做“三角函数值查表”的东西,然后得出sin30 0.5。 那么问题来了,sin30为什么会等于0.5呢&…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第四天-C++动态联编和虚函数(物联技术666)

链接:https://pan.baidu.com/s/1QO44mZtlgbiStTuI6sQP4g?pwd=1688 提取码:1688 上午:动态联编和虚函数 下午:QT介绍 教学内容: 1、动态联编和虚函数: 编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,这要求联编工作要…

国内环境 GitHub 拉取仓库速度慢的缓解方案

第一步: 浏览器打开如下两个网址,找到对应 IP 地址: GitHub.com - GitHub: Lets build from here GitHubgithub.global.ssl.fastly.net 假设对应 IP 地址分别为 140.82.xx.xxx 和 199.232.yy.yyy 第二步: 编辑 hosts 文件 sud…

openssl3.2 - 官方demo学习 - kdf - scrypt.c

文章目录 openssl3.2 - 官方demo学习 - kdf - scrypt.c概述笔记END openssl3.2 - 官方demo学习 - kdf - scrypt.c 概述 设置 kdf-SCRYPT算法的参数, 取key 笔记 /*! \file scrypt.c \note openssl3.2 - 官方demo学习 - kdf - scrypt.c 设置 kdf-SCRYPT算法的参数, 取key */…

Centos 更换内核

文章目录 一、查看/更换系统内核1.1 查看当前运行环境的内核1.2 查看系统上所有可用内核1.3 切换内核方法一:通过启动菜单更换内核方法二:更换默认启动内核 二、安装内核2.1 使用ELRepo安装2.2 安装指定内核版本参考资料 一、查看/更换系统内核 1.1 查看…

docker搭建SSH镜像、systemctl镜像、nginx镜像、tomcat镜像

目录 一、SSH镜像 二、systemctl镜像 三、nginx镜像 四、tomcat镜像 五、mysql镜像 一、SSH镜像 1、开启ip转发功能 vim /etc/sysctl.conf net.ipv4.ip_forward 1sysctl -psystemctl restart docker 2、 cd /opt/sshd/vim Dockerfile 3、生成镜像 4、启动容器并修改ro…

面试题:你知道 Spring lazy-init 懒加载的原理吗?

文章目录 前言一、先睹为快二、原理分析三、总结 前言 普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发。 Spring 启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站:topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池:一个管理线程的池子。 为什么平时都是使用线程池创建线程,直接new一个线程不好吗? 嗯,手动创建线程有两个缺点 不受控风险频繁创…

SpringBoot基础:一步步创建SpringBoot工程

摘要 本文介绍了,从零开始创建SpringBoot工程,且在每一步给出分析和原因。创建maven – 转Springboot – 引入jdbc – 引入数据库操作框架,最后给出了不同场景指定不同配置文件的方案。 背景 为什么要使用SpringBoot工程? 使用Sp…

Python 网络编程之粘包问题

【一】粘包问题介绍 【1】粘包和半包 粘包: 定义: 粘包指的是发送方发送的若干个小数据包被接收方一次性接收,形成一个大的数据包。原因: 通常是因为网络底层对数据传输的优化,将多个小数据包组合成一个大的数据块一次…

Linux搭建和使用redis

官网地址:http://redis.io/download 文件上传到服务器 tar包解压 tar zxvf redis-5.0.14.tar.gz安装 进入解压目录下,找到Makefile所在目录,执行make命令 make执行之后,会产生src等目录,进入执行make install命令…

locust快速入门--使用分布式提高测试压力

背景: 使用默认的locust启动命令进行压测时,尽管已经将用户数设置大比较大(400),但是压测的时候RPS一直在100左右。需要增加压测的压力。 问题原因: 如果你是通过命令行启动的或者参考之前文章的启动方式…