- 博客(35)
- 收藏
- 关注
原创 《设计模式之禅》笔记摘录 - 22.解释器模式
解释器模式是一种用于定义语法规则并解释语言句子的设计模式,主要由抽象解释器、终结符表达式和非终结符表达式组成。其优点是扩展性强,修改语法规则方便;缺点是易引起类膨胀、调试复杂且效率低。适用于重复发生的简单语法解析场景,但重要模块中应避免使用。实际开发中可考虑Expression4J等开源解析工具替代自研解释器。该模式在大中型框架项目中偶有应用,如数据分析工具等。
2025-09-18 20:55:14
248
原创 《设计模式之禅》笔记摘录 - 21.状态模式
什么是状态档式呢?其定义如下:Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样。状态模式的通用类图如图所示。State,抽象状态角色。
2025-09-17 20:07:16
656
原创 《设计模式之禅》笔记摘录 - 20.访问者模式
访问者模式(Visitor Pattern)是一个相对简单的模式,其定义如下:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. (封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数
2025-09-05 21:26:00
278
原创 《设计模式之禅》笔记摘录 - 19.备忘录模式
备忘录模式(Memento Pattern)提供了一种弥补真实世界缺陷的方法,让“后悔药”在程界序的世界中真实可行,其定义如下:Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later. (在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
2025-09-04 21:57:46
953
原创 《设计模式之禅》笔记摘录 - 18.建造者模式
建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:Separate the construction of a complex object from its representation so that the same ction process can create different representations. (将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2025-08-22 21:33:16
249
原创 《设计模式之禅》笔记摘录 - 17.模板方法模式
模板方法模式(Template Method Pattern)是如此简单,以致让你感觉你已经能够掌握其精髓了。
2025-08-20 19:43:47
499
原创 《设计模式之禅》笔记摘录 - 16.门面模式
门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下:Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. (要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
2025-08-16 10:13:39
544
原创 《设计模式之禅》笔记摘录 - 15.观察者模式
观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe) ,它是一个在项目中经常使用的模式,其定义如下:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于
2025-08-13 22:35:26
513
原创 《设计模式之禅》笔记摘录 - 14.组合模式
组合模式是一种将对象组合成树形结构以表示部分-整体层次关系的设计模式,使客户端对单个对象和组合对象的使用具有一致性。该模式包含抽象构件(Component)、叶子构件(Leaf)和树枝构件(Composite)三个角色。其优点在于简化高层模块调用,便于节点扩展;缺点在于实现类直接使用可能违反依赖倒置原则。适用于树形菜单、文件管理等体现部分-整体关系的场景,有透明和安全两种实现方式。该模式广泛应用于页面导航菜单、XML解析等需要处理树形结构的领域。
2025-08-08 20:22:43
699
原创 《设计模式之禅》笔记摘录 - 13.迭代器模式
迭代器模式是一种为容器提供遍历元素而又不暴露内部结构的模式,包含抽象迭代器、具体迭代器、抽象容器和具体容器四个角色。由于现代编程语言已内置迭代器实现(如Java的Iterator接口),单独实现该模式已无必要,它已成为基础工具融入各种语言和框架中。在Java开发中,建议直接使用语言提供的迭代器功能,无需自行实现这一模式。
2025-08-06 20:31:35
461
原创 《设计模式之禅》笔记摘录 - 12.适配器模式
适配器模式(Adapter Pattern)的定义如下:Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldnt otherwise because of incompatible interfaces. (将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2025-08-01 20:17:16
610
原创 《设计模式之禅》笔记摘录 - 11.策略模式
策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(Policy Pattern)。其定义如下:Define a family of algorithms, encapsulate each one, and make them interchangeable. (定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式的通用类图,如图所示。
2025-07-30 20:14:45
725
原创 《设计模式之禅》笔记摘录 - 10.装饰模式
装饰模式(Decorator Pattern)是一种比较常见的模式,其定义如下:Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
2025-07-25 20:01:07
584
原创 《设计模式之禅》笔记摘录 - 9.责任链模式
责任链模式定义如下:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it. (使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合
2025-07-23 22:44:02
471
原创 《设计模式之禅》笔记摘录 - 8.命令模式
命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式的通用类图如图所示。
2025-07-18 21:44:36
566
原创 《设计模式之禅》笔记摘录 - 7.中介者模式
中介者模式的定义为:Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently. (用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互
2025-07-16 20:56:39
676
原创 《设计模式之禅》笔记摘录 - 6.原型模式
原型模式(Prototype Pattern)的简单程度仅次于单例模式和迭代器模式。正是由于简单,使用的场景才非常地多,其定义如下:Specify the kinds of objects to create using a prototypical instance, and create new objects by copying his prototype. (用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2025-07-11 19:20:40
415
原创 《设计模式之禅》笔记摘录 - 5.代理模式
代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下:Provide a surrogate or placeholder for another object to control access to it. (为其他对象提供一种代理以控制对这个对象的访问。代理模式的通用类图:代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制。
2025-07-09 20:48:00
1061
原创 《设计模式之禅》笔记摘录 - 4.抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种比较常用的模式,其定义如下:Provide an interface for creating families of related or dependent objects without specifying ir concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的体类。
2025-07-05 16:17:24
624
原创 《设计模式之禅》笔记摘录 - 3.工厂方法模式
工厂方法模式使用的频率非常高,在我们日常的开发中总能见到它的身影。其定义为:Define an interface for creating an object, but let subclasses decide which class to instantiate..Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
2025-07-04 21:23:28
956
原创 《设计模式之禅》笔记摘录 - 2.单例模式
单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点。其优点包括减少内存开销、优化资源占用和简化共享资源访问,特别适用于频繁创建销毁对象或资源消耗大的场景。但存在扩展困难、测试不便等问题。应用场景包括唯一序列号生成、共享计数器、工具类等。使用时需注意线程同步和对象复制问题,还可扩展为有上限的多例模式。在Spring框架中,Bean默认采用单例模式以方便生命周期管理。
2025-07-02 22:41:48
598
原创 《设计模式之禅》笔记摘录 - 1.六大设计原则
本文介绍了软件设计中的六大原则:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则和开闭原则。单一职责原则强调类或接口应只有一个职责;里氏替换原则要求子类能够替换父类而不影响程序行为;依赖倒置原则提倡高层模块和低层模块都应依赖抽象;接口隔离原则建议接口应尽量细化,避免臃肿;迪米特法则主张类间应保持低耦合,减少不必要的依赖;开闭原则则强调系统应对扩展开放,对修改关闭。这些原则共同指导开发者设计出高内聚、低耦合、易于维护和扩展的软件系统。
2025-05-18 21:34:14
1145
原创 《重构》笔记摘录 - 9.处理继承关系
即便在子类继承是合理的建模方式的情况下,如果子类与超类之间的耦合过强,超类的变化很容易破坏子类的功能,我还是会使用以委托取代超类。除了“子类用得上超类的所有函数”之外,合理的继承关系还有一个重要特征:子类的所有实例都应该是超类的实例,通过超类的接口来使用子类的实例应该完全不出问题。直实世界的分类结构可以作为设计继承关系的提示,但还有很多时候,合理的继承关系是在程序演化的过程中才浮现出来的:我发现了一些共同元素,希望把它们抽取到一处,于是就有了继承关系。对于不同的变化原因,我可以委托给不同的类。
2025-04-26 10:32:18
963
原创 《重构》笔记摘录 - 8.重构API
不使用以查询取代参数最常见的原因是,移除参数可能会给函数体增加不必要的依赖关系——迫使函数访问某个程序元素,而我原本不想让函数了解这个元素的存在,这种“不必要的依赖关系”除了新增的以外,也可能是我想要稍后去除的,例如为了去除一个参数,我可能会在函数体内调用一个有问题的函数,或是从一个对象中获取某些原本想要剥离出去的数据。不过,将函数封装成自己的对象,有时也是一种有用的办法。在浏览函数实现时,我有时会发现一些令人不快的引用关系,例如,引用一个全局变量,或者引用另一个我想要移除的元素。这种函数的测试也更容易。
2025-04-20 16:26:02
794
原创 《重构》笔记摘录 - 7.简化条件逻辑
一个常见的场景是:我可以构造一组类型,每个类型处理各自的一种条件逻辑。在带有复杂条件逻辑的函数中,代码(包括检查条件分支的代码和真正实现功能的代码)会告诉我发生的事,但常常让我弄不清楚为什么会发生这样的事,这就说明代码的可读性的确大大降低了。和任何大块头代码一样,我可以将它分解为多个独立的函数,根据每个小块代码的用途,为分解而得的新函数命名,并将原函数中对应的代码改为调用新函数,从而更清楚地表达自己的意图。我必须编写代码来检查不同的条件分支,根据不同的条件做不同的事,然后,我很快就会得到一个相当长的函数。
2025-04-13 17:13:52
666
原创 《重构》笔记摘录 - 6.重新组织数据
如果我想在几个对象之间共享一个对象,以便几个对象都能看见对共享对象的修改,那么这个共享的对象就应该是引用。两者最明显的差异在于如何更新内部对象的属性:如果将内部对象视为引用对象,在更新其属性时,我会保留原对象不动,更新内部对象的属性;有一种合理的例外情况:如果计算的源数据是不可变的,并且我们可以强制要求计算的结果也是不可变的,那么就不必重构消除计算得到的派生变量。一如既往地,我在一个软件上做的工作越多,对数据的理解就越深,所以很有必要把我加深的理解融入程序中。记录结构中的字段可能需要改名,类的字段也一样。
2025-04-12 22:45:21
721
原创 《重构》笔记摘录 - 5.搬移特性
若果真如此,最好的办法是先用内联函数合并双方的内容,调整语句的顺序,再提炼出新的函数来,以形成更合适的边界。当然,我可能需要检查函数的所有调用点,判断它们是否都应该使用新的实现,但通常很少需要这么仔细,即便需要,也总好过四处寻找相似代码。同样,如果我在整理代码时,发现需要频繁调用一个别处的函数,我也会考虑搬移这个函数。一个适应于问题域的良好数据结构,可以让行为代码变得简单明了,而一个糟糕的数据结构则将招致许多无用代码,这些代码更多是在差劲的数据结构中间纠缠不清,而非为系统实现有用的行为。
2025-04-02 22:47:06
790
原创 《重构》笔记摘录 - 4.封装
一个好的模块化的设计,“封装”即使不是其最关键特征,也是最关键特征之一。本文介绍《重构》中与封装相关重构手法的基本概念。
2025-03-26 21:07:03
803
原创 《重构》笔记摘录 - 3.最常用的一组重构
只在一行的lambda表达式中使用的变量,跟踪起来很容易,像这样的变量,我经常只用一个字母命名,因为变量的用途在这个上下文中很清晰。到底应该封装什么,以及如何封装,取决于数据被使用的方式,以及我想要修改数据的方式。从道理上来说,只用提炼函数也能避免重复,但孤立存在的函数常常很难找到,只有把函数和它们操作的数据放在一起,用起来才方便。每当看见一段代码在同时处理两件不同的事,我就想把它拆分成各自独立的模块,因为这样到了需要修改的时候,我就可以单独处理每个主题,而不必同时在脑子里考虑两个不同的主题。
2025-03-22 21:53:06
952
原创 《重构》笔记摘录 - 2.代码坏味道
写下的代码应该直观明了。整洁代码最重要的一环就是好的名字,所以我们会深思熟虑如何给函数、模块、变量和类命名,使它们能清晰地表明自己的功能和用法。改名不仅仅是修改名字而已。如果你想不出一个好名字,说明背后很可能潜藏着更深的设计问题。为一个恼人的名字所付出的纠结,常常能推动我们对代码进行精简。
2025-03-09 15:51:15
805
原创 《重构》笔记摘录 - 1.重构的原则
重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的提下,提高其可理解性,降低其修改成本。重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。重构的关键在于运用的步骤,一步步达成大规模的修改。每个单独的重构要么很小,要么由若干小步骤组合而成。
2025-03-02 21:56:33
1026
原创 在linux环境上安装tomcat记录
tomcat是一种Java写的Web应用服务器,也被称为Web容器,专门运行Web程序。tomcat启动了之后会在操作系统中生成一个Jvm(Java虚拟机)的进程,从配置监听端口(默认8080)监听发来的HTTP协议的消息。
2024-11-24 21:47:54
642
原创 windows下C++配置googletest过程记录
在build文件夹下打开powershell,执行以下命令进行编译。在googletest目录中创建build文件夹。编译完成后会在build文件夹下生成若干文件。其中的文件路径要按实际情况处理。以两数之和为例,完整文件如下。
2024-07-06 21:25:57
1098
1
原创 Java单元测试使用PowerMockito打桩Thread.sleep和TimeUnit.xxx.sleep
在业务代码中,会有需要线程sleep的情况,通常会使用和时当前线程暂停执行。但是在编写单元测试时,如果不对sleep方法进行打桩,会导致单元测试执行时间过长。
2024-06-15 23:40:54
2605
原创 React使用serve -s启动服务失败,提示SyntaxError: Unexpected token ‘.‘ 问题解决
在React项目中,使用npm run build命令编译后,尝试通过serve -s build启动服务。
2024-05-31 00:05:02
937
sqlite-tools-win-x64-3460000
2024-06-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅