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

简介: 原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 系列文章介绍 本系列文章主要围绕程序员,特别是Java或者后端程序员必须掌握的一些技术和技能,这些文章都是结合我个人的编程学习经历,总结和沉淀下来的方法论。

默认文件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

面试指南

全网最热的Java面试指南,共200多页,非常实用,不管是用于复习还是准备面试都是不错的。
在公众号【Java技术江湖】回复“PDF”即可免费领取。

对本系列文章有什么建议和意见,也欢迎留言告诉我,期待你的回馈。

微信公众号【程序员黄小斜】

致力于让自学编程这件事变得更简单,授人以鱼也要授人以渔。作者自学编程转行互联网,目前是阿里巴巴Java工程师,专注于分享程序员前沿技术干货和编程学习心得,期待你的关注,和我们一起进步! 

文中所提到的推荐资源都可以免费领取,在我的公众号后台回复“设计模式”即可领取对应的下载地址。

相关文章
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
34 8
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
3月前
|
设计模式 存储 数据库连接
探索PHP中的设计模式:提高代码的可维护性与扩展性
本文将深入探讨PHP中常用的设计模式,包括单例模式、工厂模式和观察者模式。通过具体的代码示例,展示如何在实际项目中应用这些设计模式,以提高代码的可维护性与扩展性。无论你是PHP初学者还是有一定经验的开发者,都可以通过本文的学习,提升你的编程技巧和项目架构能力。
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的可维护性与扩展性
在软件开发中,设计模式是一套经过验证的解决特定问题的模板。对于使用PHP语言的开发者来说,合理运用设计模式不仅可以优化代码结构,还能显著提高项目的可维护性和扩展性。本文将探讨几种常见的设计模式及其在PHP中的应用,帮助开发者编写更高效、更灵活的代码。
39 2
|
3月前
|
设计模式 算法 搜索推荐
PHP中的设计模式:提高代码可维护性的秘诀
在本文中,我们将探讨PHP设计模式的重要性以及它们如何帮助开发者编写出更加灵活、可维护的代码。我们将介绍几种常见的设计模式,包括单例模式、工厂模式和策略模式,并通过实际示例展示它们在PHP中的应用。最后,我们会讨论何时使用这些设计模式以及在实际项目开发中的最佳实践。
43 1
|
3月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。