Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >写代码写了好几年,才发现自己天天都在用设计模式!

写代码写了好几年,才发现自己天天都在用设计模式!

原创
作者头像
程序员黄小斜
修改于 2020-03-06 01:49:01
修改于 2020-03-06 01:49:01
1.4K0
举报
默认文件1583048739345.jpg
默认文件1583048739345.jpg

原创声明

本文作者:黄小斜

转载请务必在文章开头注明出处和作者。

系列文章介绍

本系列文章主要围绕程序员,特别是Java或者后端程序员必须掌握的一些技术和技能,这些文章都是结合我个人的编程学习经历,总结和沉淀下来的方法论。作者目前在阿里做Java,忙里偷闲分享一些技术文章,希望能让更多人更容易地学习编程。

系列文章将会把一些技术学习方法、过程、要领与我的学习经验相结合,更加浅显易懂,并且我也会把我学习时用的资料,书籍和文章拿出来分享给大家,节省你我的时间。所谓授人以鱼也要授人以渔,是本系列文章希望达到的目标。

一个热爱分享的程序员,一个爱生活的斜杠青年。分享程序员编程学习干货和个人成长心得,期待你的关注,让我们一起进步!

本文思维导图

在这里插入图片描述
在这里插入图片描述

什么是设计模式

学习编程的朋友,想必对于设计模式这个词并不陌生,至少你一定也听说过,如果你是做Java的,那么就更加需要了解设计模式了,为什么这么说呢,因为Java作为一门面向对象语言,很多代码都可以通过设计模式得到简化、规范,提升编码效率和可读性。

按照百度百科的说法,软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

也就是说,代码可复用性是设计模式的核心要义。

平时我们听说过的设计模式有哪些呢,比如工厂模式,单例模式,代理模式,观察者模式等等,这些设计模式不仅在面试经常问到,而且在Java生态中也得到了广泛的应用,比如JDK里就有很多单例、工厂模式的应用,spring框架基本上也都用到了这几个设计模式,而Tomcat这种web应用容器,也是集设计模式之大成,对于观察者模式的应用特别多。

为什么要学习设计模式

那么,我们学习设计模式有什么用呢,一来,是帮助你更好地在日常开发中使用到设计模式,二来,想要理解JDK、spring以及Tomcat的实现原理和源码,你就必须要掌握相关的设计模式,否则你连代码都看不懂,又哪里谈得上开发呢。

这一点我体会很深,在大公司里,很多核心系统的代码都写得非常的高端大气上档次,对于设计模式的使用可以说是用到了极致,像是模板方法、策略模式、工厂模式等等适用于大型应用开发的一些设计模式,都会得到广泛的应用。先看懂代码,再进行开发,这肯定是程序员的自我修养之一。

学习设计模式,短期利于面试,长期则可以应用于工作,看来对设计模式的学习,已经是刻不容缓了。

新手上路

对于新手来说,设计模式完全是陌生的事物,一般常见的20多个设计模式,能够记住它的名字和用法都已经很困难了,更不用说自己能不能懂得如何去使用了。

我刚学设计模式的时候,就是抱着一本书啃半天,看完了所有的设计模式,但是过几天就忘得差不多了,面试的时候问我工厂模式,观察者模式,还是支支吾吾半天答不上来,说白了就是没有理解。

比如这个工厂模式,就分为简单工厂,工厂模式,以及抽象工厂模式,每个模式的用法都不太一样,当时就困扰了我很长一段时间。

如果你理解了它的内涵之后,就可以大概知道,简单工厂就是用来生成单一实例的,而工厂模式是可以根据输入输出不同的实例,抽象工厂则是根据不同的工厂生成不同产品的实例。

我们学习设计模式的时候,往往书本上给的栗子和demo都比较不切合实际,有的例子是动物,有的例子是食物,这个时候,如果我们自己去写一写,替换成工作中的一些场景,或者是自己熟悉的场景,比如说蔡徐坤,奥利给等等,相信更有助于你的理解和记忆。

花一些时间,跟着《head first 设计模式》这本书,把书上的设计模式案例都实现一下,能够跑得起来,要比你一遍一遍地看书来得靠谱多了。

学习源码

很多朋友看到“源码”两个字就望而却步,就好像让你玩游戏你一百个答应,让你拆开机箱看看哪块电路板因为玩游戏而严重发热,你就完全提不起兴趣。

学习设计模式,除了实战以外,最好的方式就是去看一些源码,比如JDK的源码,Spring的源码,甚至是Tomcat的源码。

如果你自己啃不动,那也可以跟着一些书籍和博客去啃,网上随便一搜就是一大把,spring里的xx设计模式、Tomcat里常见的n种设计模式,JDK里的20种设计模式等等,可能你平时都没有注意,一看自己平时用的API里居然有这么多设计模式,你就会觉得很有意思了。

举个栗子,JDK里的IO流,就使用了装饰者模式,比如对于一个IO输出流,它可能是字节流,也可能是字符流,它还可以是带缓冲的输出流,而这些特性都是通过装饰者模式实现的,IO流的实例可以不断的被转化成另一种流,只需要通过 “(装饰物)IO流”这种写法就可以不断地进行包装,就好像你买了一杯奶茶,可以往里面加椰果,加波霸,加奶加糖一样。

spring里最常用的几个设计模式就是单例模式,代理模式。大家都知道spring的IOC和AOP,spring本身提供一个bean容器,而每个bean其实都是单例的(同一个堆里只有一个实例)这其实就是用了单例模式来实现的。

那么,AOP用的是什么设计模式呢,其实就是代理模式,AOP是通过动态代理来实现的,首先,AOP是作用于某些方法或者是某些类的,你可以把这些方法或者类当成一个切面,也就是被代理的对象,而我们希望在这个切面上添加的功能,就是代理对象,比如统一的登录管理,请求拦截,安全检查等功能。如果你了解过动态代理,应该就会理解我的这个描述。

而对于Tomcat来说,设计模式就更多了,我们这里只讲一个观察者模式,Tomcat的启动是有一个生命周期(pipeline)的,你可以把这个生命周期当成一系列要执行的方法,而Tomcat的实现允许你监听这些方法的调用,你可以在pipeline上面注册自己的监听器,每当pipeline执行到你监听的方法时,它们就会通知你,然后你去执行相应的动作。

不得不说,设计模式在Java生态中的应用实在是太多了,当然,理解设计模式这件事于是需要你花一定时间的。

结合工作

理解抽象的事物往往都是具有挑战性的。学习设计模式,我们一般都是看书或者看教程,一般会有对一个模式的介绍,以及相应的代码,既然有代码实现,那就不能算是太抽象的东西,不过,这些样例代码往往和我们开发工作中的实现相去甚远,所以,我们学习设计模式的时候也往往会学了就忘,更无法应用到开发工作中。

在工作中,有一项神秘的技能,可以让你的代码能力突飞猛进,让你的代码质量、规范,以及可复用程度大大提升,这项神秘的技能,其实就是CV,没错,就是复制粘贴。

什么?不就是抄代码吗,我上我也行啊。不不不,程序员的事怎么能叫抄呢,那叫学习!参考!复用!

不过,在大公司里,CV这件事虽然可耻但是有用,毕竟大厂里的大牛多,代码写的好的人也多,每个团队都有那么些神仙代码,值得我们效仿学习,我就经常看到一些代码,是好几年前的大牛写的,被一直传承到现在,有时候即使要做重构或者是做迁移,都要把这些大牛的核心代码继续搬过来,可见这类优质代码的影响力之大。

我们先不管这些牛人的代码是怎么写出来的,但是这些优质的典范确实值得我们学习,比如我在开发一个系统的时候,发现里面的核心业务代码都是通过模板方法+注解化配置的方式来进行开发的,于是从头到尾看了一遍,十分佩服,觉得自己一定写不出来,那么这种代码风格就可以借鉴到另一个系统中。

比如最近我全程负责另一个系统的开发,我自己可以定义规范和风格,那么我当然要大展身手了,于是,这些优质的代码模板和设计风格就都被我拿来参考了,毕竟,在大公司里尽量不要重复造轮子,多借鉴多学习一定是没有坏处的,等到你掌握了这些东西的内核之后,自己再去创造一套规范和风格也未尝不可。

其实,不仅是设计模式,还有很多东西都是可以这样通过模仿来学习的,比如架构的设计,系统的分析,技术栈的选择等等,所谓书读百遍其义自见,熟读唐诗三百首,不会做诗也会吟,讲究的就是一个“熟能生巧”吧。

推荐资源

书籍

《head first设计模式》

《大话设计模式》

推荐资源

书籍

《head first设计模式》

《大话设计模式》

视频

这里我整理了一些还算不错的视频资源分享给大家,具体请在公众号【程序员黄小斜】内回复“设计模式”即可查看

博客

Java技术仓库《Java程序员复习指南》

https://github.com/h2pl/Java-Tutorial

整合全网优质Java学习内容,帮助你从基础到进阶系统化复习Java

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA使用JAVACV实现图片合成短视频,并给视频添加音频!!!
玩抖音的时候,发现可以根据图片生成视频,并添加音频,同时刚好在项目当中也遇到需要利用多张图片生成视频的操作,特此记录下实现的过程!!!
海加尔金鹰
2020/06/09
9.2K0
续更—Java游戏编程不完全详解-4
当我们玩游戏时,我们可能会听到声效,但是不会真正注意它们。因为希望听到他们,所以声效在游戏中是非常重要的。
老九君
2021/10/13
1K0
续更—Java游戏编程不完全详解-4
猫头虎分享:如何在Java中使用FFmpeg解析视频时长、封面和大小
在Java开发中,处理视频文件的时长、封面和大小等信息是常见需求。为此,Java提供了多种库来实现这些功能。本文将对比几种常用的Java视频处理库,并提供使用JavaCV获取视频信息的示例代码。
猫头虎
2024/11/18
8310
猫头虎分享:如何在Java中使用FFmpeg解析视频时长、封面和大小
JavaCV的摄像头实战之七:推流(带声音)
本篇概览 本文是《JavaCV的摄像头实战》的第七篇,在《JavaCV的摄像头实战之五:推流》一文中,咱们将摄像头的内容推送到媒体服务器,再用VLC成功播放,相信聪明的您一定觉察到了一缕瑕疵:没有声音 虽然《JavaCV的摄像头实战》系列的主题是摄像头处理,但显然音视频健全才是最常见的情况,因此就在本篇补全前文的不足吧:编码实现摄像头和麦克风的推流,并验证可以成功远程播放音视频 关于音频的采集和录制 本篇的代码是在《JavaCV的摄像头实战之五:推流》源码的基础上增加音频处理部分 编码前,咱们先来分析一下,
程序员欣宸
2021/12/07
1.8K0
JavaCV的摄像头实战之七:推流(带声音)
【详解】Java实现视频格式转化
在当今数字化时代,视频已成为我们日常生活和工作中不可或缺的一部分。不同的设备和平台可能支持不同的视频格式,因此,视频格式转换的需求也日益增长。Java作为一种广泛使用的编程语言,其强大的跨平台特性和丰富的库支持使得它成为实现视频格式转换的理想选择。本文将介绍如何使用Java实现视频格式转换。
大盘鸡拌面
2024/12/31
4010
为自己的短视频盖一个专属的印章----JavaCV之流媒体水印
无论是歌曲,小说,还是技术文章从古至今都是各种抄袭,各种拿来就用,随着技术的发展,朋友圈的图片,商铺的图片,也开始各种拿来就用,所以发明了水印,当然不止图片有水印,视频也可以有的。
用户2242639
2021/06/29
2.3K0
JavaCV的摄像头实战之六:保存为mp4文件(有声音)
本篇概览 本文是《JavaCV的摄像头实战》的第六篇,在《JavaCV的摄像头实战之三:保存为mp4文件》一文中,咱们将摄像头的内容录制为mp4文件,相信聪明的您一定觉察到了一缕瑕疵:没有声音 虽然《JavaCV的摄像头实战》系列的主题是摄像头处理,但显然音视频健全才是最常见的情况,因此就在本篇补全前文的不足吧:编码实现摄像头和麦克风的录制 关于音频的采集和录制 本篇的代码是在《JavaCV的摄像头实战之三:保存为mp4文件》源码的基础上增加音频处理部分 编码前,咱们先来分析一下,增加音频处理后具体的代码逻
程序员欣宸
2021/12/07
8710
JavaCV的摄像头实战之六:保存为mp4文件(有声音)
语音识别 | Java 实现 AI 人工智能技术 - 语音识别功能
说到语音识别、语音翻译、图像识别、人脸识别等等,现在已经非常非常非常普及了,看过‘最强大脑’的朋友,也应该对‘小度’这个机器人有所了解,战胜国际顶尖的‘大脑’- 水哥,(PS:内幕不知),那么今天,我们来看下关于语音识别,是如何做到的,Java又是如何识别语音的?如何转换语音?
码神联盟
2018/07/30
8K0
语音识别 |  Java 实现 AI 人工智能技术 - 语音识别功能
rtsp 获取视频流 java_Java获取rtsp视频流,实现rtsp流预览功能,并将视频流每帧保存成图片…
public static void testzc() throws FrameGrabber.Exception
全栈程序员站长
2022/11/07
3.4K0
java实现MP3
http://www.javazoom.net/mp3spi/mp3spi.html
py3study
2020/01/08
2.1K0
JavaCV推流实战(MP4文件)
本篇概览 自己的mp4文件,如何让更多的人远程播放?如下图所示: 这里简单解释一下上图的功能: 部署开源流媒体服务器SRS 开发名为PushMp4的java应用,该应用会读取本机磁盘上的Mp4文件,读取每一帧,推送到SRS上 每个想看视频的人,就在自己电脑上用流媒体播放软件(例如VLC)连接SRS,播放PushMp4推上来的视频 今天咱们就来完成上图中的实战,整个过程分为以下步骤: 环境信息 准备MP4文件 用docker部署SRS java应用开发和运行 VLC播放 环境信息 本次实战,我这边涉及
程序员欣宸
2021/12/07
1.5K2
JavaCV推流实战(MP4文件)
通过ChatGPT使用JavaCV
最近我在自己的服务器里基于Pandora搭建了ChatGPT页面,以后只需要accessToken或者key就可以使用,不再需要再去官网玩了,省下了不少时间。
编程思维
2024/06/24
1450
通过ChatGPT使用JavaCV
使用摄像头+JavaCV做人脸识别
上一文,我们讲到的是使用JavaCV拉取笔记本摄像头画面,这次,我们基于上一次的基础,加工人脸识别功能。
灬沙师弟
2023/09/06
1K0
使用摄像头+JavaCV做人脸识别
自己开发一个电视----流媒体之JavaCV
流媒体到底是什么?百度百科上是这么讲:“流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送数据,在网上即时传输影音以供观赏的一种技术与过程,此技术使得数据包得以像流水一样发送;如果不使用此技术,就必须在使用前下载整个媒体文件。流式传输可传送现场影音或预存于服务器上的影片,当观看者在收看这些影音文件时,影音数据在送达观看者的计算机后立即由特定播放软件播放。”
用户2242639
2021/06/29
2.5K1
云端录制直播流视频,上传云盘
哪一天我心血来潮,想把我儿子学校的摄像头视频流录制下来,并保存到云盘上,这样我就可以在有空的时候看看我儿子在学校干嘛。想到么就干,当时花了一些时间开发了一个后端服务,通过数据库配置录制参数,以后的设想是能够通过页面去配置,能够自动捕获直播视频流,这还得要求自己先学会vue,所以还得缓缓。
阿提说说
2024/02/04
3430
云端录制直播流视频,上传云盘
Java 视频处理:基于 MD5 校验秒传及 ffmpeg 切片合并的实现
本文介绍两种网络技术实现方法。一是 MD5 校验秒传,服务器端用数据库记上传文件 MD5 值及存储路径,Java 代码接收客户端 MD5 值并查询校验,返回状态码。二是用 ffmpeg 切片视频成 m3u8 上传,异步合并文件实现视频按需加载。
Yeats_Liao
2025/01/09
1710
Java 视频处理:基于 MD5 校验秒传及 ffmpeg 切片合并的实现
JavaCV的摄像头实战之一:基础
关于《JavaCV的摄像头实战》系列 《JavaCV的摄像头实战》顾名思义,是使用JavaCV框架对摄像头进行各种处理的实战集合,这是欣宸作为一名Java程序员,在计算机视觉(computer vision)领域的一个原创系列,通过连续的编码实战,与您一同学习掌握视频、音频、图片等资源的各种操作 另外要说明的是,整个系列使用的摄像头是USB摄像图或者笔记本的内置摄像头,并非基于网络访问的智能摄像头 本篇概览 作为整个系列的开篇,本文非常重要,从环境到代码的方方面面,都会为后续文章打好基础,简单来说本篇由以下
程序员欣宸
2021/12/07
1.9K2
JavaCV的摄像头实战之一:基础
C++与音视频处理:处理音频和视频数据的编码和解码
音视频处理在现代多媒体应用中起着重要的作用。C++是一种强大且广泛使用的编程语言,提供了许多用于处理音频和视频数据的库和工具。本文将介绍C++中常用的音频和视频编码解码技术,以及相关的库和工具。
大盘鸡拌面
2023/12/04
1.1K0
ChatGPT教你如何拉取本机摄像头
最近了不起在自己的服务器里基于Pandora搭建了ChatGPT页面,以后只需要accessToken或者key就可以使用,不再需要再去官网玩了,省下了不少时间。
灬沙师弟
2023/09/06
7990
ChatGPT教你如何拉取本机摄像头
JavaCV人脸识别三部曲之三:识别和预览
-若真如上图所示,那么显然confidence越小,是郭富城的可能性就越大了,接下来再去找一些权威的说法:
程序员欣宸
2022/01/06
1.1K1
JavaCV人脸识别三部曲之三:识别和预览
推荐阅读
相关推荐
JAVA使用JAVACV实现图片合成短视频,并给视频添加音频!!!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档