首页 > 其他分享 >你用过哪些设计模式(一)?

你用过哪些设计模式(一)?

时间:2023-06-28 09:01:45浏览次数:81  
标签:哪些 对象 接口 模式 信息 单例 门面 设计模式

什么是设计模式?

一些经验总结的最佳实践!

是不是必须要用?

并不是,但是既然已经说是最佳实践了,该用的地方,你不用,就有些违背常理了。

image

一、单例

这个或许是最最最常见,也是最最最常用的了。

为什么要用单例模式?

因为只需要一个对象就够了(有时候只能有一个,有时候是不需要有多个)。

对象的创建和销毁也是成本。

1、Kafka 消息发送

比如,你要发 kafka 消息,你要创建一个 Producer 对象,因为是 Producer 线程安全的,所以一般创建一个对象就够了。

借用官方的一个建议:

"The producer is thread safe and sharing a single producer instance across threads will generally be faster than having multiple instances."

2、Spring 容器 bean

Spring 容器管理的对象默认创建模式为单例。当然你也可以根据实际业务对不同的对象设置不同的创建模式。

singleton: (Default) Scopes a single bean definition to a single object instance for each Spring IoC container.

需要说明的是,这个单例只是针对一个容器。

3、本地缓存

使用 Guava 本地缓存来加速业务响应。这个对于一个业务模块也只需要创建一个,否则就会发生混乱了。

4、线程池

grpc 的线程池。

二、门面

门面模式或者也叫外观模式。

意在屏蔽复杂性,通过一个简洁的门面与外界进行交互。

1、信息输出

比如,另外一个客服系统需要调取系列的用户信息,包括基本信息,注册、登录信息,粉丝、关注信息,认证信息等等。

对于业务组来说,可能每一项都有现成的接口输出。

但是,如果直接将这么老多接口直接丢出去,似乎也显得有些不合适:信息整合容易出问题;繁多的接口交互浪费网络资源,影响业务响应时延,也容易破坏信息展现的完整性。

这里就可以将所需的不同信息接口逻辑进行整体的封装,输出一个单一的功能接口来做门面接口。

2、Netty 的 Channel

Channel是一个接口,而且是一个很大的接口,我们称之为“大而全”,囊括了server端及client端接口所需要的接口。

Channel是一个门面,封装了包括网络I/O及相关的所有操作。

Channel聚合了包括网络读写、链路管理、网络连接信息、获取EventLoop、Pipeline等相关功能类;统一分配,调度实现相应场景的功能。

3、BeanDefinitionLoader

BeanDefinitionLoader 用于从底层资源加载 bean 定义信息,包括 xml、JavaConfig。

是基于 AnnotatedBeanDefinitionReader、XmlBeanDefinitionReader、ClassPathBeanDefinitionScanner 的门面模式。

三、观察者

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式

1、Guava EventBus

用户信息修改后刷新整体缓存。

为什么使用它?

首先是异步需求:同步有针对性的信息修改。整体刷新逻辑作为缓存一致性数据保障不应该占用同步业务逻辑。

其次是解耦:用户信息比较冗繁,相应的 reload 逻辑牵涉业务甚多。所以将这部分逻辑进行解耦分离。

2、ApplicationListener

Spring ApplicationListener 应用事件监听接口,基于标准的 EventListener 接口,观察者模式实现。

ApplicationContext 通过 ApplicationEvent 类及 ApplicationListener 接口来处理事件。容器内实现了 ApplicationListener 接口的对象能够获取任何 ApplicationEvent 发布的事件。

四、策略

将军,我这里有锦囊三个,你且随身带着,路遇天门,打开锦囊一,得扣天门;路遇地门,打开锦囊二,得扣地门;路遇人门,打开锦囊三,得扣人门。

策略模式针对同一应用场景存在多种处理方式的情景。

1、发短信

一个公司会接很多外部短信通道,阿里、Tencent、Twilio 等。

发送方可能会指定特定的短信通道;发送手机号可能地属国内或者或外;

针对这种应用场景,就可以根据相应的入参选取不同的短信通道执行相应的发送操作。

3、行为验证

针对不同用户风险特征,执行不同的安全级别验证。

极验验证的滑块、点选、语序、空间推理等。

3、JDK Comparator

Collections.sort(List list, Comparator<? super T> c)

根据传入的 Comparator 比较器对相应的列表进行排序

标签:哪些,对象,接口,模式,信息,单例,门面,设计模式
From: https://www.cnblogs.com/niejunlei/p/17505537.html

相关文章

  • 设计模式--适配器模式 Adapter
    设计模式 适配器模式Adapter 定义一个规则--->和尚吃斋念经打坐撞钟习武 缺省适配器模式 鲁智深鲁达形态丑陋面貌凶顽 此人上应天星心地刚直虽时下凶顽命中驳杂久后却得清净证果非凡汝等皆不及他 就是在一个接口跟正常子......
  • 将 -Xms 参数设置和-Xmx 参数的相等,对比 -Xms参数 设置为-Xmx 参数的一半,有哪些优势?
    将-Xms参数设置为与-Xmx参数相等,相比于将-Xms参数设置为-Xmx参数的一半,具有以下优势:1.程序启动时间更短当将-Xms参数设置为与-Xmx参数相等时,JVM在启动时会分配最大内存空间,这样可以避免因为动态调整内存空间带来的时间开销。所以,相较于将-Xms参数设置为-Xmx参......
  • python有哪些用一行代码就可以完成的任务?
    python有哪些用一行代码就可以完成的任务?━━━━━━━━━━━━━━━━━━━━━━━━━Python语言采用简洁而优美的语法,可以实现非常复杂的操作。下面列举几个Python语言中可以用一行代码实现的任务:统计一个列表或字符串中元素出现次数:a=[1,2,3,1,4,2,1]cou......
  • 创新工场投资了哪些AIGC初创企业?
    创新工场是国内专注于人工智能领域的创投基金。在AIGC领域,创新工场有哪些布局呢?根据公开信息,创新工场主要投资了FOCO、潞晨科技、澜舟科技这几家AIGC企业。FOCO成立于2022年,致力于提供“AI+数字人”全流程方案。FOCO拥有来自清华、北大的研发团队,能通过自主研发的AI算法实现数字......
  • 广州企业网站建设完成后要进行哪些维护?五大关键环节不可忽视!
    广州企业网站建设完成后要进行哪些维护?企业网站对于企业来说是展示自身形象和宣传产品吸引客户和促进业务增长的重要渠道。但是建设一个优秀的广州企业网站只是踏出可第一步,关键在于后期如何对网站进行维护,以确保网站的稳定运行和持续发展。相信这一点还是被许多企业忽视的。接下来......
  • 广州电商网站建设有哪些步骤?打造高效盈利商城
    在如今的数字时代,电商网站已经成为许多企业获得更多客户和利润的渠道。然而,对于大多数企业而言,如何打造一个高效盈利的广州电商网站是他们正面临的问题。那么,广州电商网站建设有哪些步骤?接下来,广州名锐讯动MRT将带大家一起探讨其关键步骤。第一步:市场调研与网站目标定位首先在广州......
  • 优秀的小程序开发需要具备哪些条件?
    当今社会人手一台手机,而各式各样的小程序也层出不穷出现。日常生活中使用起小程序的场景越来越多。因小程序具有启动速度快,无需安装等优点,所以受到各行业的企业及商家青睐。但是,想要开发一个优秀的小程序却并不容易,需要在开发过程中进行多方面的考虑。接下来,广州名锐讯动MRT将介绍......
  • 科技项目验收测试规范有哪些?靠谱第三方软件检测机构推荐
    随着科技的不断发展和进步,越来越多的科技项目被投入使用。为了保证这些科技项目的质量,需要进行验收测试。科技项目验收测试是一项非常重要的工作,其结果对项目的质量和功能正常使用有着直接的影响。本文将就科技项目验收测试规范和第三方软件检测机构的资质进行探讨。一、科......
  • 搭建HTTPS网站准备工作有哪些?
    搭建HTTPS网站准备工作有哪些?一、证书的申请1、CSR文件申请SSL证书需要先制作CSR文件,CSR包含了你服务器信息和单位信息,需要提供给CA认证中心,确保网站的合法性,再生成CSR文件同时生成私钥文件。2、CA认证证书申请CSR提交给CA有2种认证方式:① 域名认证:对管理员邮箱进行认证,这种认证方......
  • 一文掌握设计模式(定义+UML类图+应用)
    一、引子从学编程一开始就被告知,要想做一名优秀的程序员两大必要技能:1.源码阅读(JDK、C等底层语言封装)2.设计模式(使用某种语言优雅的落地典型场景功能)。一般随着工作年限的增长,被迫对底层语言/框架源码阅读的越来愈多,但是设计模式如不刻意去学习,永远不会真正掌握。笔者把设计......