![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编程思想、设计模式、数据结构与算法
文章平均质量分 87
JAVA进阶
enterpc
这个作者很懒,什么都没留下…
展开
-
IDEA出现URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
在IDEA的xml资源文件中出现URI is not registered错误 中文意思就是统一资源标识符没有注册,解决方法就是将这个标识符手动添加到IDEA中,首先复制报红色的那串代码(只要红色的部分),然后按照步骤添加就行。 file --> settings- -> languages & frameworks -->Schemas and DTDs, 点击下方...转载 2021-12-25 18:15:07 · 465 阅读 · 0 评论 -
JDK动态代理的深入理解
引入代理模式 代理模式是框架中经常使用的一种模式,动态代理是AOP(面向切面编程)思想的一种重要的实现方式,在我们常用的框架中也经常遇见代理模式的身影,例如在Spring中事务管理就运用了动态代理,它将Service层原先应该进行的事务管理交给了Spring框架,大大简化了开发流程。在Hibernate中对象的懒加载模式,也运用了JDK的动态代理以及cglib代理。 静态代理 在说动态代理之前,我们需要先了解...转载 2021-12-25 09:33:23 · 255 阅读 · 0 评论 -
秒懂系列,深入理解Java反射机制
一、什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。 (2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。 ...转载 2021-12-24 19:16:23 · 88 阅读 · 0 评论 -
Java中的Properties类详解
1.Properties类是什么? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常改变的,为了方便用户的配置,能让用户够脱离程序本身去修改相关的变量设置。就像在Java中,其配置文件常为.properties文件,是以键值对的形式进行参数配置的。 2.API 中的Properties类 3.常用的方法 getPropert...转载 2021-12-24 16:42:53 · 5189 阅读 · 0 评论 -
ResultSetMetaData类常用方法简介
利用ResultSet的getMetaData的方法可以获得ResultSetMeta对象,而ResultSetMetaData存储了ResultSet的MetaData。所谓的MetaData在英文中的解释为“Data about Data”,直译成中文则为“有关数据的数据”或者“描述数据的数据”,实际上就是描述及解释含义的数据。以Result的MetaData为例,ResultSet是以表格的形式存在,所以getMetaData就包括了数据的字段名称...转载 2021-12-22 20:41:52 · 1558 阅读 · 0 评论 -
工厂设计模式(三种)详解
工厂设计模式,顾名思义,就是用来生产对象的,在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则,如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦 本篇主要介绍三种工厂设计模式的使用:1、简单工厂2、工厂方法3、抽象工厂 ...转载 2021-12-22 11:15:11 · 165 阅读 · 0 评论 -
设计模式之责任链模式:如何解决审核、过滤场景问题?
相较而言,责任链模式是一个使用频率很高的模式,它是我们所讲的最后一个行为型设计模式了,并且这也是整个课程的最后一讲。今天,我除了会带你搞清楚责任链模式的原理和实现外,还会对行为型设计模式做一次整体的总结。话不多说,让我们开始今天的学习吧。模式原理分析责任链模式的原始定义是:通过为多个对象提供处理请求的机会,避免将请求的发送者与其接收者耦合。链接接收对象并沿着链传递请求,直到对象处理它。这个定义读起来还是有点抽象难懂,实际上它只说了一个关键点:通过构建一个处理流水线来对一次请求进行多次的处理。这里我转载 2021-11-03 09:50:36 · 559 阅读 · 0 评论 -
设计模式之命令模式:如何在一次请求中封装多个参数?
命令模式使用频率不算太高,这里你可能会问:命令和查询有什么区别?简单来说,查询是获取一个不可变的结果,而命令是改变状态,不一定获取结果。如果你熟悉函数式编程的话,会发现命令模式完全没有使用的必要,甚至在业务开发的场景中也很少使用到。不过对于想要找到正确抽象的设计者来说,命令模式的设计思想却非常值得借鉴。因此,在这一讲中我们会剖析命令模式的原理和实现,帮助你深入理解命令模式的精髓。话不多说,让我们开始今天的学习吧。模式原理分析命令模式的原始定义是:将一个请求封装为一个对象,从而让我们可以参数化具有不同转载 2021-11-03 09:46:56 · 333 阅读 · 0 评论 -
设计模式之解释器模式:如何实现一个自定义配置规则功能?
解释器模式使用频率不算高,通常用来描述如何构建一个简单“语言”的语法解释器。它只在一些非常特定的领域被用到,比如编译器、规则引擎、正则表达式、SQL 解析等。不过,了解它的实现原理同样很重要,能帮助你思考如何通过更简洁的规则来表示复杂的逻辑。话不多说,让我们开始今天的学习吧。模式原理分析解释器模式的原始定义是:用于定义语言的语法规则表示,并提供解释器来处理句子中的语法。语法也称文法,在语言学中指任意自然语言中句子、短语以及词等语法单位的语法结构与语法意义的规律。比如,在编程语言中,if-else 用转载 2021-11-03 09:43:54 · 374 阅读 · 0 评论 -
设计模式之迭代器模式:如何实现遍历数据时的职责分离?
迭代器模式是我们学习一个设计时很少用到的、但编码实现时却经常使用到的行为型设计模式。在绝大多数编程语言中,迭代器已经成为一个基础的类库,直接用来遍历集合对象。在平时开发中,我们更多的是直接使用它,很少会从零去实现一个迭代器。不过,我们课程的宗旨就是要弄懂原理,更好地帮助你去灵活使用这些设计模式。所以,今天我会重点讲解迭代器的原理和实现。话不多说,让我们开始今天的学习吧。模式原理分析迭代器模式又叫游标(Cursor)模式,它的原始定义是:迭代器提供一种对容器对象中的各个元素进行访问的方法,而又不需要暴转载 2021-11-03 09:41:42 · 164 阅读 · 0 评论 -
设计模式之中介者模式:如何通过中间层来解决耦合过多的问题?
中介者模式理解起来并不难,代码实现简单,学习难度也很小,只要合理充分地应用这个模式,往往就能够解决一些意想不到的问题。那这到底是怎样一个模式?多用于什么场景中?为什么使用?该怎么使用?话不多说,让我们带着这些问题开始今天的学习吧。模式原理分析中介者模式的原始定义是:中介者对象封装了一组对象之间的交互,这组对象会将它们的交互委托给中介者对象,而不是直接交互。可以看到,这个定义是难得的简单和明确,中介者对象就是用于处理对象与对象之间的直接交互,封装了多个对象之间的交互细节。我们还是先来看看中介者模式的转载 2021-11-03 09:37:49 · 370 阅读 · 0 评论 -
设计模式之备忘录模式:如何在聊天会话中记录历史消息?
相较于其他的设计模式,备忘录模式不算太常用,但好在这个模式理解、掌握起来并不难,代码实现也比较简单,应用场景就更是比较明确和有限,一般应用于编辑器或会话上下文中防丢失、撤销、恢复等场景中。所以,相较前面的课程来说,今天的内容学起来会比较轻松些。话不多说,让我们开始今天的学习吧。模式原理分析备忘录模式的原始定义是:捕获并外部化对象的内部状态,以便以后可以恢复,所有这些都不会违反封装。这个定义是非常简单的,我们可以直接来看看备忘录模式对应的 UML 图:备忘录模式的 UML 图从该 UML 图中,转载 2021-11-03 09:34:31 · 335 阅读 · 0 评论 -
设计模式之观察者模式:如何发送消息变化的通知?
观察者模式是一种非常流行的设计模式,也常被叫作订阅-发布模式。观察者模式在现代的软件开发中应用非常广泛,比如,商品系统、物流系统、监控系统、运营数据分析系统等。现在我们常说的基于事件驱动的架构,其实也是观察者模式的一种最佳实践。当我们观察某一个对象时,对象传递出的每一个行为都被看成是一个事件,观察者通过处理每一个事件来完成自身的操作处理。通过这一讲的学习,相信你对观察者模式的原理、应用场景等会有更深入的理解和思考。那么话不多说,让我们开始今天的学习吧。模式原理分析观察者模式的原始定义是:定义对象之间转载 2021-11-03 09:30:45 · 715 阅读 · 0 评论 -
设计模式之状态模式:如何通过有限状态机监控功能的“状态变化”?
状态模式的应用场景非常广泛,比如,线上购物订单、手机支付、音乐播放器、游戏、工作流引擎等场景。状态模式设计的初衷是应对同一个对象里不同状态变化时的不同行为的变化。那么,当我们遇见类似的场景时,该如何来使用状态模式呢?话不多说,让我们开始今天的学习吧。模式原理分析状态模式的原始定义是:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了自己的类一样。这个定义确实有点抽象,简单来说,状态模式就是让一个对象通过定义一系列状态的变化来控制行为的变化。比如,给购买的物品定义几个包裹运送状态,已下单转载 2021-10-28 11:48:06 · 353 阅读 · 0 评论 -
设计模式之 策略模式:如何解决不同活动策略的营销推荐场景?
在上一讲中,我们学习了模板方法模式。模板方法模式能帮助我们进行公有方法的抽取,起到快速复用和扩展的作用。今天,我们接着学习另外一种可以快速复用和扩展代码的行为型模式:策略模式。策略模式在实际的开发中很常用,最常见的应用场景是利用它来替换过多的 if-else 嵌套的逻辑判断。除此之外,它还能结合工厂模式给客户端提供非常灵活的使用体验。那么,话不多说,让我们开始今天的课程吧。模式原理分析策略模式的原始定义是:定义一系列算法,封装每个算法,并使它们可以互换。策略让算法独立于使用它的客户端而变化。在这个转载 2021-10-28 11:45:41 · 447 阅读 · 0 评论 -
设计模式之模板方法模式:如何实现同一模板框架下的算法扩展?
今天我们继续来学习一个新的行为型设计模式:模板方法模式。模板方法模式的原理和代码实现都比较简单,在软件开发中也被广泛应用,但是因为使用继承机制,副作用往往盖过了主要作用,所以在使用时尤其要小心谨慎。不过,通过今天的学习,相信你能够把握好这个度。话不多说,让我们开始今天的学习吧。模式原理分析模板方法模式原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。从这个定义中,我们能看出模板方法模式的定位很清楚,就是为了解决算法框架这类特定的转载 2021-10-28 11:43:18 · 173 阅读 · 0 评论 -
设计模式之访问者模式:如何实现对象级别的矩阵结构?
从这一讲开始,我们就进入行为型设计模式的学习。行为型设计模式主要的关注点是对象内部算法及对象之间的职责和分配,比如,具体实现算法、选择策略、状态变化等抽象概念。除了我们熟悉的 GoF 的分类方式外,行为型模式还可以分为以下两种。类行为型模式:使用继承的方式来关联不同类之间的行为。对象行为型模式:使用组合或聚合方式来分配不同类之间的行为。今天我们先来讲一个原理看似很简单,但是理解起来有一定难度,使用场景相对较少的行为型模式:访问者模式。虽然访问者模式的使用场景不多,但我还是希望你能好好学习转载 2021-10-28 11:40:57 · 136 阅读 · 0 评论 -
设计模式之代理模式:如何控制和管理对象的访问?
代理模式的原理非常简单,它和装饰模式很类似,都是在不改变同一个接口功能的前提下,对原有接口功能做扩展。但是代理模式的应用却比装饰模式更为广泛,因为代理模式并不执着于链式结构,而是采用更为灵活的单一结构,在很多框架和组件的设计里都能看到代理模式的身影,比如,JDK 的动态代理机制、Spring 的 AOP 机制、Dubbo 框架等。那么,为什么代理模式能够获得如此广泛的应用呢?话不多说,现在就让我们带着这个疑问开始今天的学习吧。模式原理分析代理模式的原始定义是:让你能够提供对象的替代品或其占位符。代理转载 2021-10-28 11:38:13 · 289 阅读 · 0 评论 -
设计模式之享元模式:如何通过共享对象减少内存加载消耗?
在上一讲中,我们介绍了门面模式,门面模式应用广泛,不仅可以在架构设计层面组合不同的子系统来完成庞大功能(比如,电商系统),而且还可以在代码级别用于对象之间的调用解耦。今天我们继续学习另外一种结构型模式——享元模式。享元模式的原理和实现都很简单,但是应用场景却相对狭窄,它和现在我们所熟知的缓存模式、池化模式有所联系,却又有不同。学习完今天这一讲后,相信你会找到这个不同之处。那么,话不多说,让我们开始今天的学习吧。模式原理分析享元模式的原始定义是:摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所转载 2021-10-28 11:36:28 · 284 阅读 · 0 评论 -
设计模式之门面模式:如何实现 API 网关的高可用性?
前面我们已经学习了组合模式、桥接模式、装饰模式、适配器模式这 4 种结构型设计模式,今天我们接着再来学习另一种新的结构型模式——门面模式。门面模式的原理非常容易理解,使用也非常灵活,因此,它的应用非常广泛。不过,你是不是经常把门面模式和代理模式搞混淆?比如,业务 API 网关和 Nginx 网关是不是差不多?实际上这两种模式的本质原理是不同的。相信通过今天的学习,会帮助你找到一个更准确的答案。话不多说,让我们开始今天的学习吧。模式原理分析门面模式的原始定义是:为子系统中的一组接口提供统一的接口。它定转载 2021-10-28 11:31:52 · 576 阅读 · 0 评论 -
设计模式之装饰模式:如何在基础组件上扩展新功能?
在前面几讲中,我们已经学习了结构型模式中的适配器模式、桥接模式和组合模式。而今天我们要介绍的装饰模式看上去和适配器模式、桥接模式很相似,都是使用组合方式来扩展原有类的,但其实本质上却相差甚远呢。简单来说,适配器模式侧重于转换,而装饰模式侧重于动态扩展;桥接模式侧重于横向宽度的扩展,而装饰模式侧重于纵向深度的扩展。那么装饰模式到底有哪些需要我们重点学习的地方呢?话不多说,就让我们带着这个问题开始今天的学习吧!模式原理分析装饰模式的原始定义是:允许动态地向一个现有的对象添加新的功能,同时又不改变其结构,转载 2021-10-28 11:06:03 · 393 阅读 · 0 评论 -
设计模式之组合模式:如何用树形结构处理对象之间的复杂关系?
如果单纯从字面上来看,我们很容易将“组合模式”和“组合关系”搞混。组合模式最初只是用于解决树形结构的场景,更多的是处理对象组织结构之间的问题。而组合关系则是通过将不同对象封装起来完成一个统一功能。虽然组合模式并不常用,但是学习它的原理能够帮助我们获得更多复杂结构上的思考。比如,MySQL 的索引设计中就是用了 B+ 树算法的组合模式设计,极大地提升了数据查询时的性能。组合模式的原理很容易理解,但是在代码实现上却是反直觉的,如果你一下子看不懂其原理,我建议你多看几遍,并结合例子来反复思考。话不多说,让我们转载 2021-10-28 10:51:54 · 621 阅读 · 0 评论 -
设计模式之桥接模式:如何实现抽象协议与不同实现的绑定?
在上一讲中,我们学习了第一种结构型模式——适配器模式,它是在不改变目标类代码的情况下,通过引入适配器类来给目标类扩展功能。适配器模式在维护开发中经常会使用到,比如,常用在一些无法直接修改原有功能的旧系统里,开发一些新的扩展功能。今天,我们继续学习另外一种结构型模式——桥接模式。桥接模式的原理非常简单,但是使用起来会有一定的难度,所以相对于适配器模式来说,在理解桥接模式时,我们学习的重点要能跳出局部,多从整体结构上去思考。话不多说,让我们正式开始今天的学习吧!模式原理分析桥接模式的定义是:将抽象部分与转载 2021-10-28 10:39:27 · 292 阅读 · 0 评论 -
设计模式之适配器模式:如何处理不同 API 接口的兼容性?
在前面的五讲中,我们一起学习了创建型的设计模式。从今天开始,我们就开始学习另外一组设计模式——结构型模式。如果说创建型设计模式的关注重点在于一个对象内部结构的话(常常是接口与实现的组合),那么结构性设计模式的关注重点就在于多个对象之间的组合方式。结构型设计模式一共包括七种:适配器模式、桥接模式、组合模式、装饰模式、门面模式、享元模式和代理模式。今天这一讲,我们主要讲解最常用到的适配器模式。那么,话不多说,让我们开始今天的学习吧!模式原理分析适配器模式的原始定义是:将类的接口转换为客户期望的另一个接口转载 2021-10-27 18:18:53 · 2215 阅读 · 0 评论 -
设计模式之原型模式:什么场景下需要用到对象拷贝?
原型模式最早出现于 1963 年的一个叫 Sketchpad 的系统中,说起 Sketchpad 你可能并不熟悉,但是说起 CAD(计算机辅助设计),现在在工程设计领域几乎无人不知,其实 Sketchpad 就被认为是现代 CAD 程序的鼻祖,主要思想是拥有一张可以实例化成许多副本的原图,如果用户更改了主工程图,则所有实例也会更改。这便是原型模式最初的思维模型。不过在面向对象编程中,对象的原型在变化时通常不会影响新实例对象。实际上,原型模式不仅在 Java、C++ 等主要基于类的编程语言中有广泛应用,而且转载 2021-10-27 11:53:43 · 341 阅读 · 0 评论 -
设计模式之工厂方法模式:如何解决生成对象时的不确定性?
在上一讲中,我们介绍了工厂模式中的抽象工厂模式,为便于你更好地理解,我们还通过家具厂的实例讲解了抽象工厂的使用步骤,并结合 Spring Framework 框架中的 BeanFactory 说明了寻找正确抽象的重要性。今天我们接着来讲解另外一个工厂模式:工厂方法模式(Factory Method Pattern)。工厂方法模式就是我们俗称的工厂模式,和抽象工厂模式很类似,但工厂方法模式因为只围绕着一类接口来进行对象的创建与使用,使用场景更简单和单一,在实际的项目中使用频率反而比抽象工厂模式更高。那么转载 2021-10-27 11:23:25 · 169 阅读 · 0 评论 -
设计模式之抽象工厂模式:如何统一不同代码风格下的代码级别?
在 GoF 的《设计模式》一书中,工厂模式被分为了三种:简单工厂、工厂方法和抽象工厂。(不过,在书中作者将简单工厂模式看作是工厂方法模式的一种特例。)在实际工作中,用得比较多的就是工厂方法模式和抽象工厂模式这两类。今天,我们先来讲解抽象工厂模式。学习抽象工厂模式真正的重点和难点在于:如何找到正确的抽象。虽然抽象工厂模式很容易实现,但更重要的是我们要能意识到“正确的抽象往往都很简单也很底层”,比如,数据库的增删改查操作,日志的 debug、info、warn、error 级别,JVM 内存模型,等等。其实转载 2021-10-27 10:52:27 · 127 阅读 · 0 评论 -
设计模式之 建造者模式:如何创建不同形式的复杂对象?
在上一讲中,我们讲解了单例模式以及它的应用场景,并且还实现了一个基于 ThreadLocal 线程级别的全局上下文的完整单例的例子。今天,我们继续往下学习另外一个高频使用的创建型设计模式——Builder 模式,中文一般叫建造者模式或生成器模式。事实上,建造者模式的代码实现非常简单,原理掌握起来也不难,而难点就在于什么时候采用它。比如,经常会遇到的以下两个问题:为什么直接使用构造函数或者使用 set 方法来创建对象不方便?为什么一定需要建造者模式来创建?好了,带着上面两个问题,让我们开始转载 2021-10-27 10:50:30 · 242 阅读 · 0 评论 -
设计模式之单例模式:如何有效进行程序初始化?
从这一讲开始,我们就正式进入模块三“编程模式”的学习了。设计模式导学不过,在这之前,我想简单和你聊聊设计模式的学习路径这个话题。这也是很多同学都很关心的话题。设计模式的底层逻辑关于设计模式,现在有很多同学反馈说:学习了很多设计模式的课程和文章,依然不会用设计模式;设计模式适用场景没有设计原则多;设计模式入门简单,精通很难;设计模式太复杂看不懂;面试前才会看设计模式;设计模式不如面向搜索编程有用;……不可否认,一方面大家都很重视设计模式的学习,另一方面却转载 2021-10-27 10:44:39 · 641 阅读 · 0 评论 -
设计模式之契约原则:如何做好 API 接口设计?
无论是架构设计还是编码实现,现在都越来越离不开接口设计,接口可以说是新时代的“集装箱”,是得到了几乎所有人一致共识的通用标准。GoF 在很多年前便建议大家应该针对接口编程,原因其实就是为了降低编程变化而导致风险出现的概率。不过现实中,你可能遇见的更多是这样的情况:定义好的 API 接口,却接收了额外的参数,导致程序异常退出;查询返回的数据,没有回传预期的格式,数据处理出错;一个 API 服务进行分布式部署,遗漏了某个节点,导致处理数据不一致。现代软件开发虽然一直在按照约定进行编程转载 2021-10-26 18:00:07 · 340 阅读 · 0 评论 -
设计模式之分离原则:如何将复杂问题拆分成小问题?
关注点分离原则是一个帮助我们将复杂问题拆分成小问题的好方法。什么是关注点?简单来说,在计算机科学中,关注点是能对程序代码产生影响的一组特定信息。比如,在面向对象编程中将关注点描述为对象,在面向函数编程中将关注点描述为函数,在架构设计中将模块、组件、框架描述为关注点,等等。其实,在前面的文章里,我们也或多或少涉及了关注点分离原则的具体实践。比如,在分层架构中按照服务类型来划分层,层就被作为一个关注点。再比如,在类或方法的编码实现中按职责分离,就是将职责作为一个关注点。那么,为什么应该使用关注点分离原则来转载 2021-10-26 17:33:54 · 1786 阅读 · 0 评论 -
设计模式之惯例原则:如何提升编程中的沟通效率?
在软件开发中,你是不是经常因为沟通效率低下而烦恼?所接手的维护项目代码质量低,频繁出问题,不得不一次又一次地找之前的人沟通;团队中模块分散,各自编程风格不同,使用对方服务时需要反复沟通;跨团队合作沟通,技术栈不同,需要反复沟通统一的标准。你会发现,这些问题的本质其实都是因为代码而产生了学习成本和沟通成本,或者说,每一份代码都变成了需要重新学习的东西,自然需要反复研究和沟通。那为什么学习了 Spring 框架后,再和别人交流关于这个框架的问题时沟通效率会变高?因为 Spring Bo转载 2021-10-26 17:18:56 · 192 阅读 · 0 评论 -
设计模式之反转原则:如何减少代码间的相互影响?
在上一讲中,我们学习了 SOLID 五大设计原则,了解了在实际工作中应该如何有针对性地使用这些原则。不过,其中有一个原则,可能是你用得很熟练,但是说到概念却又容易跟其他原则混淆的,那就是依赖反转原则(Dependence Inversion Principle,简称 DIP)。在实际的研发工作中,你是不是遇见过以下场景?一个平台系统,需要接入各种各样的业务系统,而这些业务系统都有自己的账号体系,平台需要兼容这些系统的账号体系,于是代码中出现了大量依赖于各种账号体系的代码。一个网站页面,需要越来转载 2021-10-26 15:56:19 · 192 阅读 · 0 评论 -
设计模式之面向对象原则:面向对象编程框架到底长什么样?
说到面向对象编程,有一个原则几乎每个程序员都知道,那就是 SOLID 原则。关于它的资料介绍也非常丰富,实践例子也很多。但实际上你很可能把 SOLID 原则都用错了,并且还无意识地一直在滥用它。之所以这么说,一方面是因为很多时候你都将每一个原则分开使用,容易造成过度解读。比如,在使用接口隔离原则时容易只关心接口,而忽略不同实现,或者不关心接口之间的关系以及和整体系统之间的关系。另一方面是因为它总是能让你无意识地将简单的问题复杂化。比如,明明只需要写一个一次性同步数据的方法,然后写完即扔,但是突然想到 SO转载 2021-10-26 10:38:30 · 173 阅读 · 0 评论 -
设计模式之职责原则:如何在代码设计中实现职责分离?
在面向对象编程中,你是不是经常听到“要实现代码间的职责分离”,但是具体什么样的代码才算得上是清晰的职责分离,似乎却又总是模糊不清。比如:代码模块越多职责越清晰?按照需求来分配职责就是职责分离?模块化就是职责分离?实际上,你要想写出“职责分离”的代码,单从字面含义是很难下手的,因为业界并没有统一的通用标准。比如,什么是职责分离?为什么职责分离很重要?具体如何实现职责分离?所以,今天我们就一起带着这些问题来学习与理解职责分离。高内聚、低耦合:职责分离的目标什么是职责?在《敏捷软件开转载 2021-10-26 10:04:09 · 352 阅读 · 0 评论 -
设计模式之表达原则:如何让源代码成为一种逻辑线索?
维护代码是程序员非常重要的日常工作之一,那么你是否曾遇见过以下问题?接手维护项目,却发现文档缺失、代码无注释,加上维护人离职,基本只能靠猜来梳理代码逻辑。代码风格过于抽象(命名过短、魔鬼数字、重名方法等),看不懂,也不敢轻易修改。运行代码出现故障时,不打日志,不抛异常,导致定位问题需要耗费很长时间。大段的if-else代码嵌套组合,调用逻辑复杂冗长,扩展性差,重构优化费时、费力。你发现没,造成这些问题的原因其实都是代码的可读性差,没能很好地串联起代码内在的逻辑。可读性差的代码难转载 2021-10-26 09:53:09 · 221 阅读 · 0 评论 -
设计模式之最少原则:如何实现“最少知识”代码?
在实际的软件开发中,我们经常会写下面这样的代码:复制代码final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();代码看上去没有太大的问题,但实际上其中任意一个方法发生变化时,这段代码都需要修改。因为调用是依赖的每一个细节,不仅增加了耦合,也使代码结构僵化。迪米特法则正是为了避免对象间出现这样过多的细节依赖而被提出来,所以今天我们就来一起了解下迪米特法则带给我们的一些启示。什么是迪米特法则迪米特法则(转载 2021-10-26 09:39:59 · 149 阅读 · 0 评论 -
设计模式之简单原则:如何写出“简单”代码?
你发现没,设计原则通常都有一个很普遍的特点:语言很简练,听上去很有道理,但是拿来指导实践根本无从下手。比如说,在学习简单原则(也就是我们平时说的 KISS 原则) 时,你可能遇到过下列问题:为什么身边的程序员都告诉你保持“简单”代码很重要?什么才是好的“简单”代码?如何能写出“简单”的代码?YAGNI 原则和 KISS 原则是相同的吗?这些问题看上去简单,回答起来却不简单。所以,今天我们就带着这些问题,重新开始学习 KISS 原则。为什么要让代码保持“简单”?KISS 原则转载 2021-10-26 09:22:47 · 195 阅读 · 0 评论 -
设计模式之单一原则:如何跳出错误抽象的误区?
从这一讲开始,我们就进入本课程的第二个模块——设计原则,这会为你更好地理解第三模块里的经典 GoF 设计模式打下坚实的基础。在软件开发中,我们都学习过一些经典的设计原则,其中包括面向对象原则(SOLID)、简单原则(KISS)、单一原则(DRY)、最少原则(LoD)、分离原则(SoC)等。你会发现,分开来看这些原则时,会觉得它们都很有道理,似乎只要照着用就能提升编程能力和代码质量,但为什么到真正编码时你却会有选择困难的矛盾感觉呢?其实原因就在于,有的原则之间是相互冲突的,而有的原则之间又是彼此重复的。转载 2021-10-25 17:49:42 · 173 阅读 · 0 评论 -
设计模式之迭代思维:如何高效编程?
在编程的路上,你是不是曾有过这样的经历:虽然学会一门编程语言后会写代码了,但是有时写出的代码可能并没有想象的那么好。比如:你的代码只要没有经过测试,发布上线后总是会频繁发生故障;每次你修改完代码后,程序总会出现各种意外问题;当别人读完你的代码后,会说“逻辑太复杂”“代码看不懂”“代码不够简洁”之类的话;每隔一段时间后你看自己写的代码,发现不仅可读性差,而且很多逻辑连自己也看不懂了;你接手了离职同事留下的代码,却因为文档和注释太少,花了很长时间才看懂代码中的关键逻辑;你想在转载 2021-10-25 17:36:41 · 383 阅读 · 0 评论