java
文章平均质量分 93
办公模板库 素材蛙
命数如织 当为磐石
展开
-
设计模式之美100-如何将设计思想、原则、模式等理论知识应用到项目中?
上一节课,我们对整个专栏的理论知识点做了串讲复习,不知道你掌握得如何?对于上节课总结的重点内容,我希望你能多花点时间搞透彻,对于一些不那么重要的内容,我建议你把专栏当作工具资料,用到的时候随手查阅,再深入学习研究。实际上,很多小伙伴反应,虽然理论掌握得差不多,专栏也很贴近实战,每个知识点的讲解都有结合实际的代码案例,并且最后还有集中的项目实战,但落实到自己写代码的时候,还是无法将学到的理论知识很好地应用到其中。今天,我们就再聊一聊,如何将设计思想、原则、模式等理论知识应用到实际的项目开发中。原创 2023-05-16 07:58:19 · 342 阅读 · 0 评论 -
设计模式之美99-总结回顾:在实际软件开发中常用的设计思想、原则和模式
到今天为止,理论部分和实战部分都已经讲完了,整个专栏也接近尾声了。我这里用两节课的时间,带你一块复习一下前面学到的知识点。跟前面的讲解相对应,这两节课分别是针对理论部分和实战部分进行回顾总结。今天,我先来带你回顾一下整个专栏的知识体系。我们整个专栏围绕着编写高质量代码展开,涵盖了代码设计的方方面面,主要包括面向对象、设计原则、编码规范、重构技巧、设计模式这五个部分。我们就从这五个方面,带你一块把之前学过的知识点串一遍。话不多说,让我们正式开始今天的学习吧!原创 2023-05-15 07:33:53 · 152 阅读 · 0 评论 -
设计模式之美98-项目实战三:设计实现一个支持自定义规则的灰度发布组件(实现)
DarkFeature类表示每个要灰度的业务功能的灰度规则。DarkFeature将配置文件中灰度规则,解析成一定的结构(比如RangeSet),方便快速判定某个灰度对象是否落在灰度规则范围内。原创 2023-05-15 07:33:04 · 214 阅读 · 0 评论 -
设计模式之美97-项目实战三:设计实现一个支持自定义规则的灰度发布组件(设计)
上一节课,我们介绍了灰度组件的一个需求场景,将公共服务平台的RPC接口,灰度替换为新的RESTful接口,通过灰度逐步放量,支持快速回滚等手段,来规避代码质量问题带来的不确定性风险。跟前面两个框架类似,灰度组件的功能性需求也比较简单。上一节课我们做了简单分析,今天我们再介绍一下,这个组件的非功能性需求,以及如何通过合理的设计来满足这些非功能性需求。话不多说,让我们正式开始今天的学习吧!原创 2023-05-15 07:31:04 · 210 阅读 · 0 评论 -
设计模式之美96-项目实战三:设计实现一个支持自定义规则的灰度发布组件(分析)
到现在为止,我已经带你学习了接口限流框架和接口幂等框架两个实战项目。接下来,我再带你实战一个新的项目:灰度发布组件。这也是我们专栏的最后一个实战项目。还是老套路,我们把它分为分析、设计、实现三个部分、对应三节课来讲解。今天,我们对灰度发布组件进行需求分析,搞清楚这个组件应该具有哪些功能性和非功能性需求。话不多说,让我们正式开始今天的学习吧!原创 2023-05-15 07:30:12 · 167 阅读 · 0 评论 -
设计模式之美95-项目实战二:设计实现一个通用的接口幂等框架(实现)
上一节课,我们讲解了幂等框架的设计思路。在正常情况下,幂等框架的处理流程是比较简单的。调用方生成幂等号,传递给实现方,实现方记录幂等号或者用幂等号判重。但是,幂等框架要处理的异常情况很多,这也是设计的复杂之处和难点之处。比如,代码运行异常、业务系统宕机、幂等框架异常。虽然幂等框架要处理的异常很多,但考虑到开发成本以及简单易用性,我们对某些异常的处理在工程上做了妥协,交由业务系统或者人工介入处理。这样就大大简化了幂等框架开发的复杂度和难度。今天,我们针对幂等框架的设计思路,讲解如何编码实现。原创 2023-05-15 07:30:38 · 204 阅读 · 0 评论 -
设计模式之美94-项目实战二:设计实现一个通用的接口幂等框架(设计)
上一节课,我们介绍了幂等框架的一个重要需求场景,接口超时重试。为了避免同一业务被多次重复执行,接口需要支持幂等特性。同时,我们还对功能性需求和非功能性需求做了梳理。今天,我们来讲解幂等框架的设计思路。跟限流框架类似,幂等框架的功能性需求也比较简单,但要考虑处理的异常情况有很多,比如业务代码异常、业务系统宕机、幂等框架异常。今天,我们重点讲解如何应对这些异常情况,设计一个高度容错的幂等框架。话不多说,让我们正式开始今天的学习吧!原创 2023-05-15 07:29:02 · 130 阅读 · 0 评论 -
设计模式之美93-项目实战二:设计实现一个通用的接口幂等框架(分析)
上三节课,我带你分析、设计、实现了一个接口限流框架。在分析阶段,我们讲到需求分析的两大方面,功能性需求分析和非功能性需求分析。在设计阶段,我们讲了如何通过合理的设计,在实功能性需求的前提下,满足易用、易扩展、灵活、高性能、高容错等非功能性需求。在实现阶段,我们讲了如何利用设计思想、原则、模式、编码规范等,编写可读、可扩展等高质量的代码实现。从今天开始,我们来实战一个新的项目,开发一个通用的接口幂等框架。跟限流框架一样,我们还是分为分析、设计、实现三个部分,对应三节课来讲解。原创 2023-05-15 07:28:28 · 218 阅读 · 0 评论 -
设计模式之美92-项目实战一:设计实现一个支持各种算法的限流框架(实现)
这个类是限流算法实现类。它实现了最简单的固定时间窗口限流算法。每个接口都要在内存中对应一个RateLimitAlg对象,记录在当前时间窗口内已经被访问的次数。RateLimitAlg类的代码如下所示。对于代码的算法逻辑,你可以看下上节课中对固定时间窗口限流算法的讲解。原创 2023-05-15 07:28:43 · 204 阅读 · 1 评论 -
设计模式之美91-项目实战一:设计实现一个支持各种算法的限流框架(设计)
上一节课,我们介绍了限流框架产生的项目背景,并且对需求做了分析,这其中包括功能性需求和非功能性需求,算是在正式开始设计之前的一个铺垫。前面提到,我们把项目实战分为分析、设计、实现三部分来讲解。其中,分析环节跟之前讲过的面向对象分析很相似,都是做需求的梳理。但是,项目实战中的设计和实现,跟面向对象设计和实现就不是一回事儿了。这里的“设计”指的是系统设计,主要是划分模块,对模块进行设计。这里的“实现”实际上等于面向对象设计加实现。原创 2023-05-15 07:27:28 · 146 阅读 · 0 评论 -
设计模式之美90-项目实战一:设计实现一个支持各种算法的限流框架(分析)
结束了开源实战,从今天开始我们正式进入项目实战模块。在开源实战中,我带你一块剖析了几个著名的开源项目,比如Spring、MyBatis、Google Guava等,剖析了它们背后蕴含的设计思想、原则和模式。如果说前面讲开源实战是学习别人怎么做,那现在我们讲项目实战就是带你一块做。在这个过程中,我会带你实践之前学过的设计思想、原则和模式,给你展示怎么应用这些理论知识,让你开发出跟前面那些著名开源项目一样优秀的软件。原创 2023-05-15 07:25:30 · 136 阅读 · 0 评论 -
设计模式之美89-开源实战五(下):总结MyBatis框架中用到的10种设计模式
上节课,我带你剖析了利用职责链模式和动态代理模式实现MyBatis Plugin。至此,我们已经学习了三种职责链常用的应用场景:过滤器(Servlet Filter)、拦截器(Spring Interceptor)、插件(MyBatis Plugin)。今天,我们再对MyBatis用到的设计模式做一个总结。它用到的设计模式也不少,就我所知的不下十几种。有些我们前面已经讲到,有些比较简单。原创 2023-05-14 08:19:40 · 161 阅读 · 0 评论 -
设计模式之美88-开源实战五(中):如何利用职责链与代理模式实现MyBatisPlugin?
实际上,MyBatis Plugin跟Servlet Filter、Spring Interceptor的功能是类似的,都是在不需要修改原有流程代码的情况下,拦截某些方法调用,在拦截的方法调用的前后,执行一些额外的代码逻辑。它们的唯一区别在于拦截的位置是不同的。原创 2023-05-14 08:18:22 · 101 阅读 · 0 评论 -
设计模式之美87-开源实战五(上):MyBatis如何权衡易用性、性能和灵活性?
熟悉Java的同学应该知道,MyBatis是一个ORM(Object Relational Mapping,对象-关系映射)框架。ORM框架主要是根据类和数据库表之间的映射关系,帮助程序员自动实现对象与数据库中数据之间的互相转化。说得更具体点就是,ORM负责将程序中的对象存储到数据库中、将数据库中的数据转化为程序中的对象。实际上,Java中的ORM框架有很多,除了刚刚提到的MyBatis之外,还有Hibernate、TopLink等。原创 2023-05-14 08:17:25 · 116 阅读 · 0 评论 -
设计模式之美86-开源实战四(下):总结Spring框架用到的11种设计模式
上一节课,我们讲解了Spring中支持扩展功能的两种设计模式:观察者模式和模板模式。这两种模式能够帮助我们创建扩展点,让框架的使用者在不修改源码的情况下,基于扩展点定制化框架功能。实际上,Spring框架中用到的设计模式非常多,不下十几种。我们今天就总结罗列一下它们。限于篇幅,我不可能对每种设计模式都进行非常详细的讲解。有些前面已经讲过的或者比较简单的,我就点到为止。如果有什么不是很懂的地方,你可以通过阅读源码,查阅之前的理论讲解,自己去搞定它。如果一直跟着我的课程学习,相信你现在已经具备这样的学习能力。原创 2023-05-14 08:16:55 · 126 阅读 · 0 评论 -
设计模式之美85-开源实战四(中):剖析Spring框架中用来支持扩展的两种设计模式
上一节课中,我们学习了Spring框架背后蕴藏的一些经典设计思想,比如约定优于配置、低侵入松耦合、模块化轻量级等等。我们可以将这些设计思想借鉴到其他框架开发中,在大的设计层面提高框架的代码质量。这也是我们在专栏中讲解这部分内容的原因。除了上一节课中讲到的设计思想,实际上,可扩展也是大部分框架应该具备的一个重要特性。所谓的框架可扩展,我们之前也提到过,意思就是,框架使用者在不修改框架源码的情况下,基于扩展点定制扩展新的功能。原创 2023-05-14 08:16:21 · 94 阅读 · 0 评论 -
设计模式之美84-开源实战四(上):剖析Spring框架中蕴含的经典设计思想或原则
考虑到你可能不熟悉Spring,我这里对它做下简单介绍。我们常说的Spring框架,是指Spring Framework基础框架。Spring Framework是整个Spring生态(也被称作Spring全家桶)的基石。除了Spring Framework,Spring全家桶中还有更多基于Spring Framework开发出来的、整合更多功能的框架,比如Spring Boot、Spring Cloud。在Spring全家桶中,Spring Framework是最基础、最底层的一部分。原创 2023-05-14 08:16:21 · 136 阅读 · 0 评论 -
设计模式之美82-开源实战三(中):剖析GoogleGuava中用到的几种设计模式
上一节课,我们通过Google Guava这样一个优秀的开源类库,讲解了如何在业务开发中,发现跟业务无关、可以复用的通用功能模块,并将它们从业务代码中抽离出来,设计开发成独立的类库、框架或功能组件。今天,我们再来学习一下,Google Guava中用到的几种经典设计模式:Builder模式、Wrapper模式,以及之前没讲过的Immutable模式。话不多说,让我们正式开始今天的学习吧!原创 2023-05-14 08:15:52 · 194 阅读 · 0 评论 -
设计模式之美83-开源实战三(下):借GoogleGuava学习三大编程范式中的函数式编程
函数式编程的英文翻译是Functional Programming。那到底什么是函数式编程呢?在前面的章节中,我们讲到,面向过程、面向对象编程并没有严格的官方定义。在当时的讲解中,我也只是给出了我自己总结的定义。而且,当时给出的定义也只是对两个范式主要特性的总结,并不是很严格。实际上,函数式编程也是如此,也没有一个严格的官方定义。所以,接下来,我就从特性上来告诉你,什么是函数式编程。原创 2023-05-14 08:14:34 · 110 阅读 · 0 评论 -
设计模式之美81-开源实战三(上):借GoogleGuava学习发现和开发通用功能模块
考虑到你可能不熟悉Google Guava,我先对它做下简单的介绍。Google Guava是Google公司内部Java开发工具库的开源版本。Google内部的很多Java项目都在使用它。它提供了一些JDK没有提供的功能,以及对JDK已有功能的增强功能。原创 2023-05-14 08:12:47 · 175 阅读 · 0 评论 -
设计模式之美80-开源实战二(下):从Unix开源开发学习应对大型复杂项目开发
上两节课,我们分别从代码编写、研发管理的角度,学习了如何应对大型复杂软件开发。在研发管理这一部分,我们又讲到比较重要的几点,它们分别是编码规范、单元测试、持续重构和Code Review。其中,前三点在专栏的理论部分都有比较详细的讲解,而唯独Code Review我们还没有讲过,所以,今天我就借机会和你补充一下这一部分的内容。很多年前,我跟一个有十几年研发经验的某一线大厂的技术专家聊天,聊天中我提起了Code Review,他便对Code Review一顿否定。原创 2023-05-14 08:10:29 · 94 阅读 · 0 评论 -
设计模式之美79-开源实战二(中):从Unix开源开发学习应对大型复杂项目开发
我们知道,项目越复杂、代码量越多、参与开发人员越多、开发维护时间越长,我们就越是要重视代码质量。代码质量下降会导致项目研发困难重重,比如:开发效率低,招了很多人,天天加班,出活却不多;线上bug频发,查找bug困难,领导发飙,中层束手无策,工程师抱怨不断。导致代码质量不高的原因有很多,比如:代码无注释,无文档,命名差,层次结构不清晰,调用关系混乱,到处hardcode,充斥着各种临时解决方案等等。那怎么才能时刻保证代码质量呢?原创 2023-05-13 09:16:29 · 73 阅读 · 0 评论 -
设计模式之美78-开源实战二(上):从Unix开源开发学习应对大型复杂项目开发
软件开发的难度无外乎两点,一是技术难,意思是说,代码量不一定多,但要解决的问题比较难,需要用到一些比较深的技术解决方案或者算法,不是靠“堆人”就能搞定的,比如自动驾驶、图像识别、高性能消息队列等;二是复杂度,意思是说,技术不难,但项目很庞大,业务复杂,代码量多,参与开发的人多,比如物流系统、财务系统等。第一点涉及细分专业的领域知识,跟我们专栏要讲的设计、编码无关,所以我们重点来讲第二点,如何应对软件开发的复杂度。简单的“hello world”程序,谁都能写得出来。几千行的代码谁都能维护得了。原创 2023-05-13 09:14:37 · 135 阅读 · 0 评论 -
设计模式之美77-开源实战一(下):通过剖析JavaJDK源码学习灵活应用设计模式
上一节课,我们讲解了工厂模式、建造者模式、装饰器模式、适配器模式在Java JDK中的应用,其中,Calendar类用到了工厂模式和建造者模式,Collections类用到了装饰器模式、适配器模式。学习的重点是让你了解,在真实的项目中模式的实现和应用更加灵活、多变,会根据具体的场景做实现或者设计上的调整。今天,我们继续延续这个话题,再重点讲一下模板模式、观察者模式这两个模式在JDK中的应用。除此之外,我还会对在理论部分已经讲过的一些模式在JDK中的应用做一个汇总,带你一块回忆复习一下。原创 2023-05-13 09:08:55 · 93 阅读 · 0 评论 -
设计模式之美76-开源实战一(上):通过剖析JavaJDK源码学习灵活应用设计模式
从今天开始,我们就正式地进入到实战环节。实战环节包括两部分,一部分是开源项目实战,另一部分是项目实战。在开源项目实战部分,我会带你剖析几个经典的开源项目中用到的设计原则、思想和模式,这其中就包括对Java JDK、Unix、Google Guava、Spring、MyBatis这样五个开源项目的分析。在项目实战部分,我们精心挑选了几个实战项目,手把手地带你利用之前学过的设计原则、思想、模式,来对它们进行分析、设计和代码实现,这其中就包括鉴权限流、幂等重试、灰度发布这样三个项目。原创 2023-05-13 09:07:19 · 161 阅读 · 0 评论 -
设计模式之美75-在实际的项目开发中,如何避免过度设计?又如何避免设计不足?
设计模式的理论部分已经全部学习完了。现在,你可能已经蠢蠢欲动,想要赶紧实践一把,把这些理论应用到自己的项目中。不过,这里我要给你提个醒了,千万别手里拿着锤子就看什么都是钉子啊。在我过往的项目经历中,经常遇到两种同事。一种同事会过度设计。在开始编写代码之前,他会花很长时间做代码设计,在开发过程中应用各种设计模式,美其名曰未雨绸缪,希望代码更加灵活,为未来的扩展打好基础,实则过度设计,未来的需求并不一定会实现,实际上是增加了代码的复杂度,以后的所有开发都要在这套复杂的设计基础之上来完成。原创 2023-05-13 09:06:39 · 290 阅读 · 0 评论 -
设计模式之美74-总结回顾23种经典设计模式的原理、背后的思想、应用场景等
到今天为止,23种经典的设计模式已经全部讲完了。咱们整个专栏也完成了3/4,马上就要进入实战环节了。在进入新模块的学习之前,我照例带你做一下总结回顾。23种经典设计模式共分为3种类型,分别是创建型、结构型和行为型。今天,我们把这3种类型分成3个对应的小模块,逐一带你回顾一下每一种设计模式的原理、实现、设计意图和应用场景。和之前的总结文一样,今天的内容比较多,有近万字,但都是咱们之前学过的,看起来应该不会太费劲,但却能检验你是否真的掌握了这些内容。原创 2023-05-13 09:05:54 · 180 阅读 · 0 评论 -
设计模式之美73-中介模式:什么时候用中介模式?什么时候用观察者模式?
今天,我们来学习23种经典设计模式中的最后一个,中介模式。跟前面刚刚讲过的命令模式、解释器模式类似,中介模式也属于不怎么常用的模式,应用场景比较特殊、有限,但是,跟它俩不同的是,中介模式理解起来并不难,代码实现也非常简单,学习难度要小很多。如果你对中介模式有所了解,你可能会知道,中介模式跟之前讲过的观察者模式有点相似,所以,今天我们还会详细讨论下这两种模式的区别。话不多说,让我们正式开始今天的学习吧!原创 2023-05-13 09:04:48 · 81 阅读 · 0 评论 -
设计模式之美72-解释器模式:如何设计实现一个自定义接口告警规则功能?
上一节课,我们学习了命令模式。命令模式将请求封装成对象,方便作为函数参数传递和赋值给变量。它主要的应用场景是给命令的执行附加功能,换句话说,就是控制命令的执行,比如,排队、异步、延迟执行命令、给命令执行记录日志、撤销重做命令等等。总体上来讲,命令模式的应用范围并不广。今天,我们来学习解释器模式,它用来描述如何构建一个简单的“语言”解释器。比起命令模式,解释器模式更加小众,只在一些特定的领域会被用到,比如编译器、规则引擎、正则表达式。所以,解释器模式也不是我们学习的重点,你稍微了解一下就可以了。原创 2023-05-13 09:03:52 · 225 阅读 · 0 评论 -
设计模式之美71-命令模式:如何利用命令模式实现一个手游后端架构?
设计模式模块已经接近尾声了,现在我们只剩下3个模式还没有学习,它们分别是:命令模式、解释器模式、中介模式。这3个模式使用频率低、理解难度大,只在非常特定的应用场景下才会用到,所以,不是我们学习的重点,你只需要稍微了解,见了能认识就可以了。今天呢,我们来学习其中的命令模式。在学习这个模式的过程中,你可能会遇到的最大的疑惑是,感觉命令模式没啥用,是一种过度设计,有更加简单的设计思路可以替代。所以,我今天讲解的重点是这个模式的设计意图,带你搞清楚到底什么情况下才真正需要使用它。原创 2023-05-13 09:02:22 · 132 阅读 · 0 评论 -
设计模式之美70-备忘录模式:对于大对象的备份和恢复,如何优化内存和时间的消耗?
上两节课,我们学习了访问者模式。在23种设计模式中,访问者模式的原理和实现可以说是最难理解的了,特别是它的代码实现。其中,用Single Dispatch来模拟Double Dispatch的实现思路尤其不好理解。不知道你有没有将它拿下呢?如果还没有弄得很清楚,那就要多看几遍、多自己动脑经琢磨一下。今天,我们学习另外一种行为型模式,备忘录模式。这个模式理解、掌握起来不难,代码实现比较灵活,应用场景也比较明确和有限,主要是用来防丢失、撤销、恢复等。所以,相对于上两节课,今天的内容学起来相对会比较轻松些。原创 2023-05-06 09:10:07 · 109 阅读 · 0 评论 -
设计模式之美69-访问者模式(下):为什么支持双分派的语言不需要访问者模式?
上一节课中,我们学习了访问者模式的原理和实现,并且还原了访问者模式诞生的思维过程。总体上来讲,这个模式的代码实现比较难,所以应用场景并不多。从应用开发的角度来说,它的确不是我们学习的重点。话不多说,让我们正式开始今天的学习吧!原创 2023-05-06 09:08:08 · 121 阅读 · 0 评论 -
设计模式之美68-访问者模式(上):手把手带你还原访问者模式诞生的思维过程
前面我们讲到,大部分设计模式的原理和实现都很简单,不过也有例外,比如今天要讲的访问者模式。它可以算是23种经典设计模式中最难理解的几个之一。因为它难理解、难实现,应用它会导致代码的可读性、可维护性变差,所以,访问者模式在实际的软件开发中很少被用到,在没有特别必要的情况下,建议你不要使用访问者模式。尽管如此,为了让你以后读到应用了访问者模式的代码的时候,能一眼就能看出代码的设计意图,同时为了整个专栏内容的完整性,我觉得还是有必要给你讲一讲这个模式。原创 2023-05-06 09:06:58 · 87 阅读 · 0 评论 -
设计模式之美67-迭代器模式(下):如何设计实现一个支持“快照”功能的iterator?
上两节课,我们学习了迭代器模式的原理、实现,并且分析了在遍历集合的同时增删集合元素,产生不可预期结果的原因以及应对策略。今天,我们再来看这样一个问题:如何实现一个支持“快照”功能的迭代器?这个问题算是对上一节课内容的延伸思考,为的是帮你加深对迭代器模式的理解,也是对你分析、解决问题的一种锻炼。你可以把它当作一个面试题或者练习题,在看我的讲解之前,先试一试自己能否顺利回答上来。话不多说,让我们正式开始今天的学习吧!原创 2023-05-06 09:05:57 · 113 阅读 · 0 评论 -
设计模式之美66-迭代器模式(中):遍历集合的同时,为什么不能增删集合元素?
上一节课中,我们通过给ArrayList、LinkedList容器实现迭代器,学习了迭代器模式的原理、实现和设计意图。迭代器模式主要作用是解耦容器代码和遍历代码,这也印证了我们前面多次讲过的应用设计模式的主要目的是解耦。上一节课中讲解的内容都比较基础,今天,我们来深挖一下,如果在使用迭代器遍历集合的同时增加、删除集合中的元素,会发生什么情况?应该如何应对?如何在遍历的同时安全地删除集合元素?话不多说,让我们正式开始今天的内容吧!原创 2023-05-06 09:05:50 · 729 阅读 · 0 评论 -
设计模式之美65-迭代器模式(上):相比直接遍历集合数据,使用迭代器有哪些优势?
上一节课,我们学习了状态模式。状态模式是状态机的一种实现方法。它通过将事件触发的状态转移和动作执行,拆分到不同的状态类中,以此来避免状态机类中的分支判断逻辑,应对状态机类代码的复杂性。今天,我们学习另外一种行为型设计模式,迭代器模式。它用来遍历集合对象。不过,很多编程语言都将迭代器作为一个基础的类库,直接提供出来了。在平时开发中,特别是业务开发,我们直接使用即可,很少会自己去实现一个迭代器。不过,知其然知其所以然,弄懂原理能帮助我们更好的使用这些工具类,所以,我觉得还是有必要学习一下这个模式。原创 2023-05-06 09:03:54 · 244 阅读 · 0 评论 -
设计模式之美64-状态模式:游戏、工作流引擎中常用的状态机是如何实现的?
有限状态机,英文翻译是Finite State Machine,缩写为FSM,简称为状态机。状态机有3个组成部分:状态(State)、事件(Event)、动作(Action)。其中,事件也称为转移条件(Transition Condition)。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。对于刚刚给出的状态机的定义,我结合一个具体的例子,来进一步解释一下。“超级马里奥”游戏不知道你玩过没有?原创 2023-05-06 09:01:42 · 808 阅读 · 0 评论 -
设计模式之美63-职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?
上一节课,我们学习职责链模式的原理与实现,并且通过一个敏感词过滤框架的例子,展示了职责链模式的设计意图。本质上来说,它跟大部分设计模式一样,都是为了解耦代码,应对代码的复杂性,让代码满足开闭原则,提高代码的可扩展性。除此之外,我们还提到,职责链模式常用在框架的开发中,为框架提供扩展点,让框架的使用者在不修改框架源码的情况下,基于扩展点添加新的功能。实际上,更具体点来说,职责链模式最常用来开发框架的过滤器和拦截器。原创 2023-05-06 08:55:36 · 178 阅读 · 0 评论 -
设计模式之美62-职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?
前几节课中,我们学习了模板模式、策略模式,今天,我们来学习职责链模式。这三种模式具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。今天,我们主要讲解职责链模式的原理和实现。除此之外,我还会利用职责链模式,带你实现一个可以灵活扩展算法的敏感词过滤框架。原创 2023-05-06 08:50:49 · 111 阅读 · 0 评论 -
设计模式之美61-策略模式(下):如何实现一个支持给不同大小文件排序的小程序?
上一节课,我们主要介绍了策略模式的原理和实现,以及如何利用策略模式来移除if-else或者switch-case分支判断逻辑。今天,我们结合“给文件排序”这样一个具体的例子,来详细讲一讲策略模式的设计意图和应用场景。除此之外,在今天的讲解中,我还会通过一步一步地分析、重构,给你展示一个设计模式是如何“创造”出来的。通过今天的学习,你会发现,。话不多说,让我们正式开始今天的学习吧!原创 2023-05-06 08:50:07 · 108 阅读 · 0 评论