# 重学Java设计模式 **Repository Path**: littleboyzhou/relearn-java-design-pattern ## Basic Information - **Project Name**: 重学Java设计模式 - **Description**: 本仓库代码来自于开源网友仓库,设计模式code - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2023-03-20 - **Last Updated**: 2023-05-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 重学 Java 设计模式 > **作者:** 小傅哥,Java Developer,[:pencil2: 虫洞 · 科技栈,作者](https://bugstack.cn),[:trophy: CSDN 博客专家](https://bugstack.blog.csdn.net) > 本代码库是作者小傅哥多年从事一线互联网```Java```开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!




## 书籍下载&购买 #### - 小傅哥的《重学 Java 设计模式》 ⭐⭐⭐⭐ >本书是作者`小傅哥`,投入50天时间,从互联网实际业务开发中抽离出,交易、营销、秒杀、中间件、源码等22个真实业务场景,编写了18万字271页的实战型Java编程资料。如果书中含有不易理解的内容,一定是作者在编写的过程中缺少必要的描述和严格的校准,感谢把你的意见或者疑问提交给我,也欢迎与我多一些交互,互相进步共同成长。 - 旧版电子书:关注公众号:[bugstack虫洞栈 `点击扫码`](https://bugstack.cn/assets/images/qrcode.png),回复:`设计模式` - 新版纸质书:[https://item.jd.com/13218336.html](https://u.jd.com/qPnzanP) `内容补充、添加类图、重画图稿、全书彩印`,一本可以在手边随时翻阅的设计模式,感谢支持。 ## 源码下载 - **Java** [https://github.com/fuzhengwei/itstack-demo-design | `小傅哥 Java 原创版本`](https://github.com/fuzhengwei/itstack-demo-design) - **Java** [https://gitee.com/fustack/itstack-demo-design | `小傅哥 Java 原创版本`](https://gitee.com/fustack/itstack-demo-design) - **Rust** [https://github.com/Forsworns/design-pattern | `Peihao Yang Rust 贡献版本`](https://github.com/Forsworns/design-pattern) *欢迎更多小伙伴,贡献关于此设计模式其他版语言,我会帮你添加链接* --- **Hello, world of design!** 你好,设计模式的世界! 欢迎来到这里,很高兴你能拿到这本书,如果你能坚持看完并按照书中的例子进行实践,那么在编程开发的世界里,就又多了一个可以写出良好代码的人,同时也为架构师培养储备了一个人才。 可能在此之前你也多少了解过设计模式,但在实际的业务开发中使用却不多,多数时候都是大面积堆积`ifelse`组装业务流程,对于一次次的需求迭代和逻辑补充,只能东拼西凑`Ctrl+C`、`Ctrl+V`。 所以为了能让更多的程序员👨‍💻‍更好的接受设计思想和架构思维,并能运用到实际的业务场景。本书的作者`小傅哥`,投入50天时间,从互联网实际业务开发中抽离出,交易、营销、秒杀、中间件、源码等22个真实场景,来学习设计模式实践使用的应用可上手技能。 **谁发明了设计模式?** 设计模式的概念最早是由 `克里斯托佛·亚历山大` 在其著作 `《建筑模式语言》` 中首次提出的。 本书介绍了城市设计的 “语言”,提供了253个描述城镇、邻里、住宅、花园、房间及西部构造的模式, 而此类 “语言” 的基本单元就是模式。后来,`埃里希·伽玛`、 `约翰·弗利赛德斯`、 `拉尔夫·约翰逊` 和 `理查德·赫尔姆` 这四位作者接受了模式的概念。 1994 年, 他们出版了 `《设计模式: 可复用面向对象软件的基础》` 一书, 将设计模式的概念应用到程序开发领域中。 其实有一部分人并没有仔细阅读过设计模式的相关书籍和资料,但依旧可以编写出优秀的代码。这主要是由于在经过众多项目的锤炼和对程序设计的不断追求,从而在多年编程历程上提炼出来的心得体会。而这份经验最终会与设计模式提到的内容几乎一致,同样会要求高内聚、低耦合、可扩展、可复用。你可能也遇到类似的经历,在学习一些框架的源码时,发现它里的某些设计和你在做开发时一样。 **我怎么学不会设计模式?** 钱也花了,书也买了。代码还是一坨一坨的!设计模式是由多年的经验提炼出来开发指导思想。就像我告诉你自行车怎么骑、汽车怎么开,但只要你没跑过几千公里,你能记住的只是理论,想上道依旧很慌! **所以**,本设计模式专题系列开始,会带着你使用设计模式的思想去优化代码。从而学习设计模式的心得并融入给自己。当然这里还需要多加练习,一定是*人车合一*,才能站在设计模式的基础上构建出更加合理的代码。 **阅读建议** 本书属于实战型而不是理论介绍类书籍,每一章节都有对应的完整代码,学习的过程需要参考书中的章节与代码一起学习,同时在学习的过程中需要了解并运行代码。学习完成后进行知识点的总结,以及思考🤔这样的设计模式在自己的业务场景中需要如何使用。 ## 创建型模式 - [`1. 重学 Java 设计模式:实战工厂方法模式「多种类型商品不同接口,统一发奖服务搭建场景」`](https://bugstack.cn/itstack-demo-design/2020/05/20/%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F.html) - **小结:把创建者与具体的产品逻辑耦合、满足单一职责,每一个业务逻辑实现都在所属自己的类中完成、满足开闭原则,无需更改使用调用方就可以在程序中引入新的产品类型** - 简单工厂:通过if else 直接 new 一个具体的产品类型并返回。(用最简单的实现方式,所以叫简单工厂) - 工厂方法:不直接返回产品类型,而是先得到某一个具体的工厂类型,然后由该工厂生成一个于其对应的商品类型。(每个工厂类只生成一种产品类) - 抽象工厂模式:当一个工厂实现多种产品类的实现 - [`2. 重学 Java 设计模式:实战抽象工厂模式「替换Redis双集群升级,代理类抽象场景」`](https://bugstack.cn/itstack-demo-design/2020/05/24/%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F.html) - [`3. 重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」`](https://bugstack.cn/itstack-demo-design/2020/05/26/%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F.html) - **有点像菜单模式,基本的菜样不变,但组合一直在变化/新增。** - 比如主食:米饭、面条、馕;主菜:糖醋排骨、土豆炖豆角、大盘鸡。 通过组合,可以得到:上海风味(米饭+糖醋排骨)、东北风味(面条+土豆炖豆角)、新疆风味(馕+大盘鸡) 。变化的是不同的组合,通过不同的组合得到不同的风味,将变化抽象成一个builer类即可。如果需要一个新的风格,就需要新写一个组合。 - [`4. 重学 Java 设计模式:实战原型模式「上机考试多套试,每人题目和答案乱序排列场景」`](https://bugstack.cn/itstack-demo-design/2020/05/28/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F.html) - **原型模式可以理解为:一个对象的产生可以不由零起步,直接从一个已经具备一定雏形的对象克隆,然后再修改为生产需要的对象。** - 原型模式有两种实现方式——浅拷贝和深拷贝 - 浅拷贝:当拷贝对象包含基本数据类型(如int、long)或者不可变的对象(如字符串、基本类型的包装类)时,会直接将这些属性复制到新的对象中。而原型对象中的引用对象会把内存中的地址复制给克隆对象。此时,两个对象共享了一个私有变量,你改我改大家都能改。 - 深拷贝:不管原型对象属性是简单数据类型还是引用对象类型都会完全的复制一份到新的对象中。两个对象之间互不影响。 - 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式本质是一种克隆对象的方法,其核心是重写Object中的clone方法,调用该方法可以在内存中进行对象拷贝。 - [`5. 重学 Java 设计模式:实战单例模式「7种单例模式案例,Effective Java 作者推荐枚举单例模式」`](https://bugstack.cn/itstack-demo-design/2020/05/31/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F.html) ## 结构型模式 - [`1. 重学 Java 设计模式:实战适配器模式「从多个MQ消息体中,抽取指定字段值场景」)`](https://bugstack.cn/itstack-demo-design/2020/06/02/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E9%80%82%E9%85%8D%E5%99%A8%E6%A8%A1%E5%BC%8F.html) - **将一个对象通过适配器转换为另一种对象,由适配器做2种不同类型的转换【重点是转换】** - 适用场景:已存在类的方法和需求不匹配的情况,目的是解决兼容性问题。 - 原理:通过继承来实现适配器功能;具体做法:让Adapter实现Target接口,并且继承Adaptee,这样Adapter就具备Target和Adaptee的特性,就可以将两者进行转化了。 - ![img.png](img.png) - [`2. 重学 Java 设计模式:实战桥接模式「多支付渠道(微信、支付宝)与多支付模式(刷脸、指纹)场景」`](https://bugstack.cn/itstack-demo-design/2020/06/04/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F.html) - **强调不同维度的之间的组合,分离了抽象部分及其实现部分两个维度,实现了代码的解耦,提高了系统的扩展性** - 将不同的实现类作为构造参数传递到主类中,然后实现逻辑 - ![img_1.png](img_1.png) - 桥接模式和适配器模式的区别: - 构造方式不同:桥接模式是通过组合实现;适配器模式是通过继承实现 - 解决的问题不同:适配器解决兼容性问题,适配双方是强依赖;桥接模式解连接问题(不同的对象直接的组合),双方为不是强依赖; - [`3. 重学 Java 设计模式:实战组合模式「营销差异化人群发券,决策树引擎搭建场景」`](https://bugstack.cn/itstack-demo-design/2020/06/08/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E7%BB%84%E5%90%88%E6%A8%A1%E5%BC%8F.html) - **完整的名字是:逻辑组合模式** - 组合模式的主要解决的是:提供一种方式,解决一系列逻辑节点在不同结构的组合下,产生不同的结果,并且能够比较方便的未来扩展多种逻辑节点的组合。 - [`4. 重学 Java 设计模式:实战装饰器模式「SSO单点登录功能扩展,增加拦截用户访问方法范围场景」`](https://bugstack.cn/itstack-demo-design/2020/06/09/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8F.html) - **在不改原有类的基础上给类新增功能。使用继承、AOP切面,当然这些方式都可以实现不改变原有类而增加新功能,但会导致的子类过多。使用装饰器模式会是另外一种思路更为灵活,可以避免继承导致的子类过多,也可以避免AOP带来的复杂性** - 当使用继承的方式和装饰器模式来实现新功能扩展的对比 - ![img_2.png](img_2.png) - 在装饰器模式中的四个步骤; - 1.抽象构件角色(Component) - 定义抽象接口 - 2.具体构件角色(ConcreteComponent) - 实现抽象接口,可以是一组 - 3.装饰角色(Decorator) - 定义抽象类并继承接口中的方法,保证一致性 - 4.具体装饰角色(ConcreteDecorator) - 扩展装饰具体的实现逻辑 - 5.把ConcreteComponent作为构造参数传入ConcreteDecorator,在ConcreteDecorator中的实现方法中调用super的原方法 - [`5. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」`](https://bugstack.cn/itstack-demo-design/2020/06/11/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%A4%96%E8%A7%82%E6%A8%A1%E5%BC%8F.html) - [`6. 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」`](https://bugstack.cn/itstack-demo-design/2020/06/14/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E4%BA%AB%E5%85%83%E6%A8%A1%E5%BC%8F.html) - **完整的名字是:共享元信息模式。** - 应用场景:有大量重复对象可复用的场景下,固定不变的信息只做初始化,之后的每次调用只处理会变化的数据,然后与固定不变的信息进行 拼装,每次调用不必再查询本来就固定不变的数据,从而减少的数据的内存占用 - ![img_5.png](img_5.png)![img_4.png](img_4.png) - [`7. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」`](https://bugstack.cn/itstack-demo-design/2020/06/16/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F.html) - **代理模式就是代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。(为真实对象提供代理,然后供其他对象通过代理访问真实对象)** - 代理类和真实类同时实现接口,然后代理类把真实类包装一下,在代理类中的方法调用真实类的方法。 - ![img_7.png](img_7.png) ## 行为模式 - [`1. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」`](https://bugstack.cn/itstack-demo-design/2020/06/18/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F.html) - **责任链模式实际上是一种处理请求的模式,它让多个节点都有机会处理该请求,直到其中某个处理成功为止。责任链模式把多个处理器串成链,然后让请求在链上传递** - ![img_13.png](img_13.png) - 第一步:定义一个责任链的抽象类,然后每个节点的具体的逻辑类都实现这个抽象类。具体的实现类编写什么情况下调用下一节点的方法 - ![img_10.png](img_10.png) - ![img_11.png](img_11.png) - 第二步:在创建责任链时,从第一层节点开始创建,然后append它的next节点 - ![img_12.png](img_12.png) - [`2. 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」`](https://bugstack.cn/itstack-demo-design/2020/06/21/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%91%BD%E4%BB%A4%E6%A8%A1%E5%BC%8F.html) - **目的:与if语句相比,让逻辑具备单一职责的性质,降低了耦合性也方便其他的命令和实现的扩展。** - **命令模式的组成部分:命令的接口和实现类、实现者的接口和实现类、调用者。** - **把命令对象以构造函数的方式传递给调用者。调用者再提供相应的实现为命令执行提供操作方法。** - ![img_15.png](img_15.png) - **每一个具体的命令都拥有一个对应的实现类,可以进行组合。** - ![img_16.png](img_16.png) - [`3. 重学 Java 设计模式:实战迭代器模式「模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景」`](https://bugstack.cn/itstack-demo-design/2020/06/23/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E8%BF%AD%E4%BB%A3%E5%99%A8%E6%A8%A1%E5%BC%8F.html) - 提供一种方法 , 顺序访问 集合对象 中的 各个元素 ,外界的调用方也不需要知道 被遍历的元素的数据结构 - 步骤: - 1、定义集合接口Collection - ![img_17.png](img_17.png) - 2、Collection的实现类中实现迭代器 - ![img_18.png](img_18.png) - [`4. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」`](https://bugstack.cn/itstack-demo-design/2020/06/27/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E4%B8%AD%E4%BB%8B%E8%80%85%E6%A8%A1%E5%BC%8F.html) - [`5. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」`](https://bugstack.cn/itstack-demo-design/2020/06/28/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F.html) - **备忘录模式是以可以恢复或者说回滚,配置、版本、悔棋为核心功能的设计模式,在功能实现上是以不破坏原对象为基础增加备忘录操作类,记录原对象的行为从而实现备忘录模式。** - 步骤: - 1、记录者记录新的动作(数据) - 2、记录者根据新的动作(数据)产生新的备忘录(也是数据) - 3、管理者将备忘录保存到列表中 - ![img_20.png](img_20.png) - ![img_19.png](img_19.png) - 4、由记录者从管理者的列表中得到历史的数据,然后进行 undo或redo操作 - ![img_22.png](img_22.png) - [`6. 重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」`](https://bugstack.cn/itstack-demo-design/2020/06/30/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F.html) - 观察者和被观察的对象解耦 - 解决的问题:当一个对象的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 - 使用场景: - 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 - 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。 - 一个对象必须通知其他对象,而并不知道这些对象是谁。 - 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。 - [`7. 重学 Java 设计模式:实战状态模式「模拟系统营销活动,状态流程审核发布上线场景」`](https://bugstack.cn/itstack-demo-design/2020/07/02/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F.html) - [`8. 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」`](https://bugstack.cn/itstack-demo-design/2020/07/05/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F.html) - [`9. 重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」`](https://bugstack.cn/itstack-demo-design/2020/07/07/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E6%A8%A1%E6%9D%BF%E6%A8%A1%E5%BC%8F.html) - **思路:抽象类中定义抽象方法的执行顺序,并将抽象方法设定为只有子类实现。抽象类定义统一结构和执行标准(如下图),后续的实现者不用关心调用逻辑,按照统一方式执行。那么类的继承者只需要关心具体的业务逻辑实现即可。** - ![img_28.png](img_28.png) - [`10. 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」`](https://bugstack.cn/itstack-demo-design/2020/07/09/%E9%87%8D%E5%AD%A6-Java-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%AE%9E%E6%88%98%E8%AE%BF%E9%97%AE%E8%80%85%E6%A8%A1%E5%BC%8F.html) - ![img_25.png](img_25.png) - 访问者对多种数据有不同的处理逻辑 - ![img_23.png](img_23.png) - ![img_24.png](img_24.png) - 每个数据调用访问者访问自己 - ![img_27.png](img_27.png)![img_26.png](img_26.png) --- *截止到此设计模式内容就全部讲完了,可能书中会因作者水平有限,有一些描述不准确或者错字内容。欢迎提交给我,也欢迎和我讨论相关的技术内容,作者小傅哥,非常愿意与同好进行交流,互相提升技术。*