设计模式分类

news2024/11/15 10:57:09

常用的设计模式有哪些?

常用的设计模式通常按照创建型、结构型和行为型三大类别来划分,以下是每个类别中的一些常见设计模式:

创建型(Creational Patterns)

  • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。
  • 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类。
  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  • 建造者模式(Builder Pattern):将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 原型模式(Prototype Pattern):通过复制现有对象来创建新对象,而不是新建。

结构型(Structural Patterns)

  • 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。
  • 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们都可以独立变化。
  • 组合模式(Composite Pattern):允许你将对象组合成树形结构来表现“部分-整体”的层次结构,用户对单个对象和组合对象的使用具有一致性。
  • 装饰器模式(Decorator Pattern):动态地给对象添加额外职责,同时保持类的封装性和继承性的灵活性。
  • 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的高层接口,简化了外部与其交互的复杂性。
  • 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。
  • 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。

行为型(Behavioral Patterns)

  • 责任链模式(Chain of Responsibility Pattern):多个对象处理请求,对象间形成一条链,请求会沿着这条链传递直到被处理。
  • 命令模式(Command Pattern):将请求封装为一个对象,从而可以用不同的请求、队列或者日志/撤销操作来参数化其他对象。
  • 解释器模式(Interpreter Pattern):定义语言的语法或表达式,并提供了解释它的方法。
  • 迭代器模式(Iterator Pattern):提供一种方法顺序访问聚合对象的元素,而又不暴露其内部表示。
  • 中介者模式(Mediator Pattern):定义一个中介对象来封装系列对象之间的交互关系,降低对象间的耦合度。
  • 备忘录模式(Memento Pattern):在不破坏封装的前提下捕获一个对象的内部状态,以便将来恢复它。
  • 观察者模式(Observer Pattern):当对象状态改变时通知所有依赖于它的对象。
  • 状态模式(State Pattern):允许对象在内部状态改变时改变其行为,对象看起来像是改变了它的类。
  • 策略模式(Strategy Pattern):定义了一系列算法,并分别封装起来,让它们可以相互替换,使得算法的变化独立于使用它的客户。
  • 模板方法模式(Template Method Pattern):在一个抽象类中定义一个操作中的框架,而将一些步骤延迟到子类中实现。
  • 访问者模式(Visitor Pattern):表示一个作用于某对象结构中各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

以上是23种常见的设计模式的简要概述。每种模式都有特定的应用场景和目的,旨在提高代码的可重用性、可扩展性和可维护性。

Nginx可以做哪些事情?

Nginx 可以在多个层面上为 Web 应用和服务器提供强大的功能支持,以下是 Nginx 主要能够完成的任务:

  1. Web 服务器

    • 提供静态内容服务:Nginx 能够高效地处理和分发静态资源文件,如 HTML、CSS、JavaScript、图片等。
    • 大流量高并发场景:Nginx 以其非阻塞的 I/O 模型和事件驱动架构闻名,能够处理大量的并发连接而保持低内存占用。
  2. 反向代理

    • 分发请求:Nginx 可以作为反向代理服务器,将客户端的请求转发到后端的一组应用服务器上,实现负载均衡。
    • 内容缓存:Nginx 可以缓存来自上游服务器的响应内容,减少对后端服务器的压力,并提高响应速度。
  3. 负载均衡

    • 轮询、权重分配、最少连接数、IP哈希等策略进行后端服务器之间的负载均衡,确保系统稳定性和高可用性。
  4. SSL/TLS 加密与终止

    • 在 Nginx 层面处理 HTTPS 请求,通过 SSL/TLS 协议加密数据传输,并集中管理证书和加密套件。
  5. 限流与熔断

    • 使用各种模块限制客户端请求速率(如漏桶或令牌桶算法),防止 DDoS 攻击或其他异常流量导致服务过载。
    • 设置熔断机制,当后端服务器压力过大时,暂时拒绝新请求以保护系统稳定性。
  6. 动静分离

    • 动态内容由后端服务器生成,静态内容由 Nginx 直接提供,这样可以降低后端服务器压力并提高效率。
  7. URL重写与路由

    • 根据不同的 URL 规则进行重写,或者根据规则将请求转发到不同位置,实现灵活的路由功能。
  8. 防盗链

    • 配置 Nginx 来防止未经授权的网站引用你的资源,避免不必要的带宽消耗。
  9. HTTP/2 支持

    • Nginx 支持 HTTP/2 协议,提供了多路复用、头部压缩等功能,优化了现代浏览器与服务器间的通信效率。
  10. 地理位置定位

    • 根据请求者的 IP 地址将流量导向不同的服务器,以实现地理相关的服务部署。
  11. 日志记录与分析

    • Nginx 可以生成详细的访问日志,便于统计分析用户行为及监控服务器状态。
  12. 邮件代理

    • Nginx 也具有 IMAP/POP3/SMTP 代理能力,尽管这一特性在实际使用中可能不如其Web服务器功能普遍。

总之,Nginx 是一款高度可配置且性能优异的网络服务器软件,它能在多种场景下发挥重要作用,无论是大型网站的前端代理,还是中小型项目的静态文件服务器,都能提供出色的性能和服务质量。

Nginx有几种负载均衡?

Nginx 提供了多种负载均衡策略,主要包括以下几种:

  1. 轮询(Round Robin)

    • 默认的负载均衡策略,将请求按照顺序依次分配给后端服务器列表中的每个服务器。
  2. 加权轮询(Weighted Round Robin)

    • 在轮询基础上添加权重,允许为后端服务器分配不同的处理请求的比例。权重较高的服务器将会接收到更多的请求。
  3. IP哈希(ip_hash)

    • 根据客户端 IP 地址进行散列运算来决定将请求转发到哪个后端服务器,确保来自同一客户端 IP 的请求被定向到同一台服务器,这有助于解决会话保持问题。
  4. 最少连接数(Least Connections)

    • 将新的请求分发给当前连接数最少的服务器,以达到更均衡的服务器资源使用率。
  5. URL哈希(url_hash 或 hash)

    • 按照请求的 URL 进行哈希计算并根据结果选择后端服务器,确保相同的 URL 请求总是发送到同一个服务器,该特性需要第三方模块或特定版本支持。
  6. fair(第三方)

    • 第三方模块提供的策略,根据后端服务器的响应时间来进行动态调整,优先分配给之前响应时间较短的服务器。不过在 Nginx 核心中并没有直接提供这个功能,可能需要安装额外的模块才能实现。

综上所述,截至我最后更新知识库时,Nginx 自带的核心模块提供了至少四种负载均衡策略,而 fair 策略通常需要通过第三方模块来实现。不过,请注意随着技术的发展,Nginx 可能会增加更多原生支持的负载均衡算法。

Nginx的轮询里一致性哈希算法的底层原理是什么?

Nginx 的轮询(Round Robin)负载均衡策略并不直接使用一致性哈希算法。一致性哈希是一种特殊的哈希算法,用于分布式系统中将数据和请求分配到多个节点时,尽量保持在节点增减时数据分布的稳定性。

在 Nginx 的标准轮询负载均衡机制中,每个请求按照循环顺序被分发给后端服务器列表中的下一个服务器,而不涉及对客户端IP或者请求内容进行哈希计算来决定转发目标。这种简单公平的分配方式并不能解决节点添加或删除时可能导致大量请求重新映射的问题,而这正是通过一致性哈希所要解决的问题。

如果要在 Nginx 中实现类似一致性哈希的功能,通常需要借助第三方模块,例如 nginx-upstream-jhash 或者 ngx_http_consistent_hash 模块。这些模块会根据请求的某些特性(比如客户端 IP 或请求内容的一部分)生成哈希值,并基于此哈希值选择后端服务器,从而在增加或减少后端服务器时,能够更有效地维持已存在的客户端请求到服务器的映射关系,降低重新映射的成本。

Nginx如何避免缓存雪崩

在Nginx中避免缓存雪崩的策略通常与缓存失效时大量请求同时涌向后端数据库的问题相关。以下是几种在Nginx及其配合的缓存系统(如Redis)中可以采取的方法来缓解或避免缓存雪崩:

  1. 设置随机过期时间

    • 给缓存数据设置一个随机的过期时间,这样可以分散缓存失效的时间点,而不是让所有缓存在同一时刻失效。
  2. 使用多级缓存架构

    • 在应用层和Nginx之间可以设计多级缓存结构,比如先使用本地缓存(如:Memcached、FastCGI缓存),再用分布式缓存(如:Redis),当一级缓存失效时,还有下一级缓存提供保护。
  3. 渐进式失效策略

    • 当缓存即将到期时,不是立即删除而是标记为即将失效,并刷新缓存任务放入队列,由后台异步更新,确保新值准备好后再替换旧缓存。
  4. 备份和高可用性

    • 对于Redis这样的缓存服务器,采用主从复制或者集群模式,以提高缓存服务的可用性,即使某台服务器宕机也不会导致全部缓存失效。
  5. 限流与熔断

    • 配置Nginx的限流模块(例如limit_req)限制在单位时间内对后端服务器的请求次数,当请求超过阈值时,可以通过返回错误页面或其他降级策略来防止过多流量直接冲击数据库。
  6. 监控与预警

    • 建立完善的监控系统,及时发现缓存异常情况,一旦发生雪崩迹象,通过自动化运维工具快速响应和恢复。
  7. 缓存预热

    • 在缓存失效前或服务启动初期,主动将热点数据加载到缓存中,确保重启后短时间内不会有大量数据库查询压力。

结合以上方法,可以在Nginx及相关的缓存体系中构建一套有效的防护机制,降低缓存雪崩造成的影响。不过实际实施时需要根据具体的业务场景和技术栈进行合理调整和配置。

服务器的CUP超负荷了,如何排查是哪个项目的?

服务器CPU超负荷时,排查具体是哪个项目导致的CPU使用率过高,可以遵循以下步骤:

  1. 实时监控

    • 使用系统自带的工具(如Linux中的tophtoppidstat等)实时查看CPU占用情况,并按CPU使用率排序找出消耗CPU资源最多的进程ID(PID)。
  2. 定位进程与项目关联

    • 根据获取到的高CPU使用率的进程PID,进一步通过ps aux | grep PID命令查看该进程的详细信息,包括命令行参数和所在目录。通常,Java应用可以通过Java进程名或者jar包名称识别出对应的服务或项目。
  3. 线程级排查

    • 对于Java应用,可以使用jstack PID > thread_dump.txt生成堆栈跟踪文件,然后分析文件内容以确定哪个线程在消耗大量CPU资源。
    • 或者直接使用Arthas这样的诊断工具,通过dashboardthread等命令快速定位热点线程和方法。
  4. 日志分析

    • 查看相关项目的日志,尤其是错误日志或警告日志,查找是否有异常操作或循环逻辑导致CPU占用率飙升。
  5. 性能分析工具

    • 使用诸如VisualVM、JProfiler等Java性能分析工具连接到目标Java进程,通过采样分析、CPU火焰图等方式查看哪些方法调用链路消耗了大量CPU时间。
  6. 系统及服务配置检查

    • 检查系统层面是否存在定时任务或其他后台服务配置不当,例如:轮询间隔过短、并发处理设置不合理等。
  7. 业务数据分析

    • 结合业务数据波动情况,判断是否由于某个特定时间段内请求量激增或是特定功能模块被大量调用而引发的问题。
  8. 集群环境排查

    • 如果是在分布式环境中,需要查看整体负载均衡器的日志以及各个节点的状况,结合微服务架构找到可能压力过大的服务实例。

综合以上步骤,逐步缩小排查范围,最终锁定问题所在的项目或服务

交替打印数字和字母
问题描述
使用两个goroutine交替打印序列,一个goroutine打印数字,另外一
个goroutine打印字母,最终效果如下:
12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324
WX2526YZ2728
解题思路
问题很简单,使用channel来控制打印的进度。使用两个channel,来分别
控制数字和字母的打印序列,数字打印完成后通过channel通知字母打印,
字母打印完成后通知数字打印,然后周而复始的工作。

import (
    "fmt"
    "strings"
    "sync"
)

func main() {
    letter, number := make(chan bool), make(chan bool)
    wait := sync.WaitGroup{}
    go func() {
        i := 1
        for {
            select {
            case <-number:
                fmt.Print(i)
                i++
                fmt.Print(i)
                i++
                letter <- true
                break
            default:
                break
            }
        }
    }()
    wait.Add(1)
    go func(wait *sync.WaitGroup) {
        str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        i := 0
        for {
            select {
            case <-letter:
                if i >= strings.Count(str, "")-1 {
                    wait.Done()
                    return
                }
                fmt.Print(str[i : i+1])
                i++
                if i >= strings.Count(str, "") {
                    i = 0
                }
                fmt.Print(str[i : i+1])
                i++
                number <- true
                break
            default:
                break
            }
        }
    }(&wait)
    number <- true
    wait.Wait()
}

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

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

相关文章

openssl3.2 - 测试程序的学习 - test\acvp_test.c

文章目录 openssl3.2 - 测试程序的学习 - test\acvp_test.c概述笔记要单步学习的测试函数备注END openssl3.2 - 测试程序的学习 - test\acvp_test.c 概述 openssl3.2 - 测试程序的学习 将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照…

二极管漏电流对单片机ad采样偏差的影响

1&#xff0c;下图是常规的单片机采集电压电路&#xff0c;被测量电压经过电阻分压&#xff0c;给到mcu采集&#xff0c;反向二极管起到钳位作用&#xff0c;避免高压打坏mcu。 2&#xff0c;该电路存在的问题 二极管存在漏电流&#xff0c;会在100k电阻上产生叠加电压&#x…

Cybellum—信息安全测试工具

产品概述 由于软件和数据在汽车上的使用越来越多&#xff0c;汽车越来越“智能化”&#xff0c;汽车行业面临着重大的信息安全挑战。2021年8月&#xff0c;ISO/SAE 21434正式发布&#xff0c;标准中对汽车的信息安全提出了规范化的要求&#xff0c;汽车信息安全不容忽视。 Cyb…

什么是数据库的三级模式两级映象?

三级模式两级映象结构图 概念 三级模式 内模式&#xff1a;也称为存储模式&#xff0c;是数据物理结构和存储方式的描述&#xff0c;是数据在数据库内部的表示方式。定义所有的内部记录类型、索引和文件组织方式&#xff0c;以及数据控制方面的细节。模式&#xff1a;又称概念…

GA/T 1400视图库服务平台Easy1400视图库平台发布了,免费下载使用,23年做社会贡献的最后一项完成!

在23年12月开始的时候&#xff0c;立了一个flag&#xff0c;要给社会贡献一款免费可用的GA/T 1400视图库服务平台&#xff0c;原因背景也在《免费的GA/T 1400视图库服务平台》、《GA/T 1400视图库服务平台开发完成了&#xff0c;采集设备接入、人脸/人员/机动车/非机动车图库、…

Final Cut Pro for Mac(fcpx视频剪辑)v10.7.1 中文版

Final Cut Pro是由苹果公司开发的一款专业视频编辑软件&#xff0c;主要用于影片的后期剪辑、调色、特效、音频处理等方面。 软件下载&#xff1a;Final Cut Pro for Mac v10.7.1 中文版 以下是Final Cut Pro的特点&#xff1a; 高效的视频编辑功能&#xff1a;Final Cut Pro提…

80 C++对象模型探索。数据语义学 - 数据成员布局-成员变量的地址规律,字节对齐问题,成员变量偏移值

一。观察成员变量地址规律 静态成员变量 不占用 类对象 的空间 1.普通成员变量的存储顺序&#xff0c;是按照在类中的定义顺序从上到下 来的 class Teacher4 { public:int m_i;static int m_si;//这里是声明一个static&#xff0c;并不是定义&#xff0c;声明不会分配空间int…

上位机图像处理和嵌入式模块部署(多ui文件使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 编写上位机程序的时候&#xff0c;qt wizard一般会帮我们创建一个ui文件。不过这个ui文件一般就是主窗口布局文件。当然&#xff0c;因为软件在执行…

北斗卫星为野外科考人员提供安全保障

北斗卫星为野外科考人员提供安全保障 自第二次青藏高原综合科学考察研究启动以来&#xff0c;青海不断提升科考服务保障能力&#xff0c;推动科考全程信息化&#xff0c;有效促进科考成果转化。 为保障科考人员的人身安全&#xff0c;青海省青藏科学考察服务中心开发了基于北…

ORB-SLAM中的RANSAC算法解析

RANSAC算法解析 RANSAC是一种在具有噪声的模型中去估计最优的一个算法&#xff0c;其核心思想是采用不断迭代的方法去选择一组全是内点的集合&#xff0c;并采用该集合进行模型估计的一种方法&#xff0c;可以提高模型估计的鲁棒性。 假设目前有 K K K组采集到的数据&#xff…

手把手教你搓一个最小系统板【画PCB-->布线 -->制版-->焊接】

文章目录 一、基础电路1. 晶振电路2. 稳压电路3. 复位/按键电路4. BOOT电路5. SWD接口6. 滤波电容7. LED电路8. 拓展引脚设计总览 二、布局布线三、制版四、焊接 在大学嵌入式相关专业&#xff0c;有许多同学是更偏向软件上的设计&#xff0c;并不懂硬件上的实现&#xff0c;而…

CMake构建Qt工程

在https://blog.csdn.net/fengbingchun/category_12172633.html 上有直接通过vs2022建的Console、Widgets、Quick三个工程&#xff0c;这里增加通过CMake构建。 build.sh内容如下&#xff1a; #! /bin/bashif [ $# ! 1 ]; thenecho "Error: requires one parameter: Rele…

(八)springboot实战——springboot3下的webflux项目全局异常处理

前言 在webflux响应式编程中&#xff0c;如何处理系统运行时异常是本节的主要内容。在传统的Servlet阻塞式web项目中主要通过HandlerExceptionResolver处理器来处理&#xff0c;而在webflux响应式web项目中&#xff0c;则是通过DispatchExceptionHandler异常处理器来处理异常。…

vue模拟聊天页面列表:滚动到底部,滚动到顶部触发加载更多

先看下效果&#xff1a; 代码&#xff1a; <template><div><div style"text-align: center"><button click"scrollTop">滚动到顶部</button><button click"scrollBottom">滚动到底部</button></d…

R12.2 EBS 修改 APPS 密码 详细步骤

目录 前言准备修改步骤1.关闭应用层2.FNDCPASS 修改密码3. 运行 autoconfig4.单独启动 webLogic 服务5.登录weblogic&#xff0c;更新apps密码6.启动应用层7.验证 结尾 前言 本文的目的是修改 apps 密码&#xff0c;主要参考官方文档 metalink 1674462.1&#xff0c;请注意本文…

go语言(十九)---- channel

channel的使用 //1. 发送value到channelchannel <- value //2. 接收并将其丢弃<- channel //3. 从channel中接收数据&#xff0c;并将其赋值给x x : <- channel 例子 package mainimport "fmt"func main() {//定义一个channelc : make(chan int)go func…

如何在Shopee平台上进行宠物类目的选品丨shopee宠物选品

在Shopee平台上进行宠物类目的选品是一个重要的任务&#xff0c;它直接关系到卖家的销售业绩和市场竞争力。为了成功选择适合的宠物用品&#xff0c;在选品过程中&#xff0c;卖家可以遵循以下策略&#xff1a; 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#…

【C语言/数据结构】排序(直接插入排序|希尔排序)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 插入排序 直接插入排序&…

网站服务器中毒或是被入侵该怎么办?

随着互联网的普及和发展&#xff0c;网站服务器已经成为了企业和个人存储数据、展示信息的重要平台。然而&#xff0c;网络安全问题也日益突出&#xff0c;其中网站服务器中毒或被入侵的事件时有发生。一旦发生这种情况&#xff0c;不仅会导致网站无法正常运行&#xff0c;还可…

大数据期望最大化(EM)算法:从理论到实战全解析

文章目录 大数据期望最大化&#xff08;EM&#xff09;算法&#xff1a;从理论到实战全解析一、引言概率模型与隐变量极大似然估计&#xff08;MLE&#xff09;Jensen不等式 二、基础数学原理条件概率与联合概率似然函数Kullback-Leibler散度贝叶斯推断 三、EM算法的核心思想期…