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

【设计模式】漫谈设计模式

这篇文章里说一下对设计模式的个人的理解。本篇文章更类似于随笔而非技术文档。

设计模式最早是在上个世纪就被人提出来了,如今被奉为圣经,也就是GOF等人写的《设计模式》,其中的设计模式,是指导开发者如何进行开发出高内聚、低耦合、易扩展的好代码的。我在小白时,时常疑惑,设计模式在开发中如何进行落地呢?

今天把以前的疑问落在文章中,回答过去的自己吧。

首先要知道的是设计模式提出的时代背景,出在一个硅谷的黄金时代,个人开发者靠自己就可以写出商用软件的时代。此时,如何只靠自己,写出高内聚、低耦合的好代码,是那时开发者的问题。GOF等人设计模式的总结,使得好的开发经验得到了总结,依靠这些模式,使得开发者可以更轻松的进行设计和开发。

不过,大人,时代变了。如今已经不是硅谷黄金时代,仅靠个人就可以实现一个火遍全球的商用软件那样英雄主义的事,不复存在,大多数开发者,只是一个开发工作中的小小的分子。我们不得不依靠大量成熟的商用中间件和框架及更易使用的高级语言,这大大加速了我们开发的速度,减轻了我们设计和开发的难度,同时意味着,我们对于设计模式的依赖,变得更小了。即使不怎么懂设计模式的小白,依靠spring boot也能快速搭建起一个web项目。

但是这并不意味着设计模式不存在或者无用了,设计模式实际上大量存在于框架和中间件中(只是作为java web开发,一般很少会直接用到设计模式),举例如下,

线程池、连接池,用到的是享元(Flyweight)模式

java和cglib的动态代理,用的是代理(Proxy)模式

spring框架中的过滤器在使用时,会从spring中传个参数叫filterChain,这个用的是责任链(Chain of Responsibility)模式

实现了Collection接口的集合类中,都会提供一个叫做Iterator的迭代器,用于遍历集合,用到的是迭代器(Interator)模式

如今用于项目解耦的MQ,用到的是中介者(Dediator)模式

zookeeper里的watcher机制,一个zk节点可以被多个watch关注,在变动时触发回调,用的是观察者(Observer)模式

lombok框架的builder注解,用的是建造者(Builder)模式

spring框架容器在注入对象时,类型为single对对象进行复用时,用的是单例(Singleton)模式

还有我们在进行RPC服务提供时,常常把一个api接口层的包提供出去,用的是外观(Facade)模式

我们在开发时,经常会给每个模块的实现类抽象出一个接口来,规定impl类的行为,这个用的是模板方法(Template Method)模式

除了最后两个,web开发在开发中其实很少直接应用设计模式。至此,以前我的疑问已经回答了。我们是间接的应用了设计模式的多,直接应用设计模式的少。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 端点安全新纪元:EDR与XDR技术的融合应用
  • 洛谷 P6280 [USACO20OPEN] Exercise G
  • 【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】
  • Docker最佳实践进阶(二):Docker Compose容器编排
  • conda 常见使用命令详解
  • 单例模式下的自动内存释放和模板
  • 【C++初阶】:C++入门篇(一)
  • 计算机网络 —— 物理层
  • 了解Android
  • WPF 中,ControlTemplate 和 DataTemplate 是两种不同类型的模板和区别
  • 网络工程师学习笔记(一)
  • Unity Pro安装教程
  • Debezium系列之:记录一次SQLServer数据库数据不采集,恢复采集造成下游承压的情况,以及相对应的详细解决方案
  • USART————单字节串口的发送和发送接收
  • STM32——I2C和SPI波形分析
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Apache的基本使用
  • Bootstrap JS插件Alert源码分析
  • canvas 高仿 Apple Watch 表盘
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • js操作时间(持续更新)
  • Linux gpio口使用方法
  • magento 货币换算
  • SAP云平台里Global Account和Sub Account的关系
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 开发基于以太坊智能合约的DApp
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信公众号开发小记——5.python微信红包
  • 微信小程序--------语音识别(前端自己也能玩)
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (19)夹钳(用于送货)
  • (LeetCode C++)盛最多水的容器
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (四)opengl函数加载和错误处理
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET构架之我见
  • .net连接oracle数据库
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @EnableAsync和@Async开始异步任务支持
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • @Transactional 详解