- 博客(190)
- 资源 (12)
- 收藏
- 关注
原创 设计模式学习笔记 - 设计模式与范式 -结构型:7.享元模式(上):享元模式原理和应用
1.享元模式的原理所谓 “享元”,就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象时不可变对象。具体来讲,当一个系统中存在大量重复对象的时候,就可以利用享元模式,将对象设计成享元,在内存中只保留一份实例,供多处代码引用,这样可以减少内存中对象的数量,以及起到节省内存的目的。实际上,不仅仅相同的对象可以设计成享元,对于相似的对象,也可以将这些对象中相同的部分(字段),提取出来设计成享元,让这些大量相似对象引入这些享元。2.享元模式的实现。
2024-03-28 22:16:03 425
原创 设计模式学习笔记 - 设计模式与范式 -结构型:6.组合模式
组合模式与其说是一种设计模式,倒不如说是对业务场景的一种数据结构和算法的抽象。其中,数据Key表示成树这种数据结构,业务需求也可以通过树上的递归遍历算法来实现。组合模式,将一组对象组织成树形结构,将单个对象和组合对象都看作树中的节点,以统一处理逻辑,并且它利用树形结构的特点,递归地处理每个子树,依次简化代码实现,使用组合模式的前提是在于,你的业务场景必须能够表示成树形结构。所以,组合模式的应用场景也比较局限,它并不是很常用的设计模式。
2024-03-28 13:38:45 638
原创 设计模式学习笔记 - 设计模式与范式 -结构型:5.门面模式:兼顾接口的通用性和易用性
类、模块、系统之间的 “通信”,一般都是通过接口调用来完成的。接口设计的好坏,直接影响到类、模块、系统是否好用。所以,要多花点心思在接口设计上。我们经常说,完成接口设计,就相当于完成了一半的开发任务。只要接口设计的好,那代码就不会差到哪里去。接口粒度设计得太大,太小都不好。太大会导致接口不可复用,太小会导致接口不易用。在实际的开发中,接口的可复用性和易用性需要 “微妙” 的权衡。针对这个问题,我的一个基本的处理原则是,尽量保证接口的可复用性,但针对特殊情况,允许提供冗余的门面接口,来提供更易用的接口。
2024-03-28 09:17:49 413
原创 设计模式学习笔记 - 设计模式与范式 -结构型:4.适配器模式
适配器模式是用来做适配,它将不兼容的接口转换为可以兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式有两种实现方式:类适配器和对象适配器。类适配器使用继承关系来实现,对象适配器使用组合关系来实现。一般来说,适配器可以看作是一种 “补偿模式”,用来补救设计上的缺陷。应用这种模式算式 “无奈之举”,如果在设计初期,就能协调规避接口不兼容的问题,那这种模式就没有应用的机会了。在实际的开发中,什么情况下才会出现接口不兼容呢?封装有缺陷的接口统一多个类的接口设计替换依赖的外部系统。
2024-03-27 23:10:51 741
原创 设计模式学习笔记 - 设计模式与范式 -结构型:3.装饰器模式
装饰器模式主要解决继承关系过于复杂的问题,通过组合来代替继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的重要依据。此外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类和接口。
2024-03-27 13:23:13 845
原创 设计模式学习笔记 - 设计模式与范式 -结构型:2.桥接模式:如何实现支持不同类型和渠道的消息推送系统?
桥接模式的原理比较难理解,但代码实现相对简单些。对于这个模式有两种不同的理解方式。GoF 的《设计模式》中,桥接模式被定义为:“将抽象和实现解耦,让它们可以独立变化。在其他书籍和资料中,还有另一种更加简单的理解方式:“一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。对于第一种 GoF 的理解方式,弄懂定义中的 “抽象” 和 “实现” 两个概念,是理解它的关键。
2024-03-26 09:48:48 646
原创 设计模式学习笔记 - 设计模式与范式 -结构型:1.代理模式:代理在RPC、缓存、监控等场景中的应用
1.代理模式的原理与实现在不改变原始类(或者叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,我们让代理类和原始类实现相同的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式。2.动态代理的原理与实现静态代理需要针对每个类都创建一个代理类,并且每个代理类中的代码都有像模板式的 “重复” 代码,增加了维护成本和开发成本。对于静态代理存在的问题,我们可以通过动态代理来解决。
2024-03-25 22:38:22 635
原创 设计模式学习笔记 - 设计模式与范式 - 创建型:7.原型模式:如何快速地clone一个HashMap散列表
1.什么是原型模式如果对象的创建成本比较大,而同一个类的对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用已有对象(原型)就进行复制(或者叫拷贝)的方式,来创建新对象,已达到节省创建时间的目的。这种基于原型来创建对象的方式就叫做原型设计模式,简称原型模式。2.原型模式的两种实现方法原型模式有两种实现方式,深拷贝和浅拷贝。浅拷贝只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象…深拷贝得到的是一份完完全全独立的对象。
2024-03-24 22:01:28 1110
原创 设计模式学习笔记 - 设计模式与范式 - 创建型:6.建造者模式:详解构造函数、set方法、建造者三种对象创建方式
本章学习一个比较常用的创建型设计模式,,中文翻译为或,也有人叫它。建造者模式的原理和代码实现非常简单,掌握起来并不难,难点在于应用场景。
2024-03-24 13:27:19 1091
原创 设计模式学习笔记 - 设计模式与范式 - 创建型:5.工厂模式(下):实现一个依赖注入框架,即 DI 容器
上篇文件讲到,简单工厂模式有两种实现方式,一种是每次都返回新创建的对象,另一种是每次都返回同一个事先创建好的对象,也就是单例对象。在 Spring 框架中,可以通过配置scope属性,来区分这两种不同类型的对象。表示返回新创建的对象表示返回单例对象不仅如此,还可以配置对象的和方法,比如。DI 容器在创建好对象之后,会主动调用属性指定的方法来初始化对象。在对象被销毁之前,DI 容器会主动调用属性指定的方法来做一些清理工作,比如释放数据库连接池、关闭文件。
2024-03-23 21:27:29 698
原创 设计模式学习笔记 - 设计模式与范式 - 创建型:4.工厂模式(上):工厂模式的介绍和使用场景分析
讲完了简单工厂、工厂方法,我们再来看下抽象工厂模式。抽象工厂模式的应用场景比较特殊,没有前两种常用,所以不是本节学习的重点,简单了解一下就好。在简单工厂和工厂方法中,类只有一种分类方式。比如,在规则配置解析那个例子中,解析器类只会根据配置文件格式(Json、Xml、Yaml…)来分类。但是,如果类有两种分类方式,比如,我们既可以按照配置文件格式来分类,也可以按照解析的对象(Rule规则配置还是 System 系统配置)来分类,那就会对应下面这 8 个 parser 类。
2024-03-23 10:39:44 746
原创 设计模式学习笔记 - 设计模式与范式 - 创建型:3.单例模式(下):线程、进程、集群环境讲下的单例
上一节课《》针对单例模式,讲解了单例的应用场景、几种场景的代码实现和存在问题,并粗略给出了替换单例模式的方式,比如工厂模式、IOC 容器。
2024-03-21 13:40:59 1000
原创 设计模式学习笔记 - 设计模式与范式 - 创建型:2.单例模式(中):为什么不推荐使用单例模式?又有何替代方案?
尽管单例是一个很常用的实际模式,在实际的开发中,也经常使用,但是,有些人认为单例是一种反模式(anti-pattern),并不推荐使用。所以,今天就针对这个说法详细地讲讲。
2024-03-20 22:15:18 1197
原创 设计模式学习笔记 - 设计模式与范式 - 创建型:1.单例模式(上):为什么说支持懒加载的双重校验不必饿汉式更优?
单例设计模式理解起来非常简单。一个类只允许创建一个对象,那这个类就是单例类,这种设计模式就叫做单例设计模式,简称单例模式。
2024-03-19 22:37:08 982
原创 设计模式学习笔记 - 设计原则与思想总结:2.运用学过的设计原则和思想完善之前性能计数器项目
在《设计原则 - 10.实战:针对非业务的通用框架开发,如何做需求分析和设计及如何实现一个支持各种统计规则的性能计数器》,我们提到,针对性能计数器这个框架的开发,要想一下子罗列所有的功能,对任何人来说是比较有挑战的。经过这几次版本的迭代后,不知不觉地就完成了几乎所有的需求,包括功能性需求和非功能性需求。设计原则 - 10.实战:针对非业务的通用框架开发,如何做需求分析和设计及如何实现一个支持各种统计规则的性能计数器。
2024-03-18 23:23:31 1149
原创 设计模式学习笔记 - 设计原则与思想总结:1.总结回顾面向对象、设计原则、编程规范、重构技巧等知识点
现在,主流的编程范式或者编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。现在比较流行的编程语言大部分是面向对象编程语言。大部分项目也是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。对于项目来说,重构可以保持代码质量持续处于一个可控状态,不至于腐化到无可救药的地步。对于个人而言,重构非常锻炼一个人的代码能力,并且是一件非常有成就感的事情。
2024-03-17 19:42:05 1140
原创 设计模式学习笔记 - 规范与重构 - 8.实践:程序出错返回啥?NULL、异常、错误吗、空对象?重构ID生成器,处理各函数的异常
在简单的代码,看上去再完美,只要我们下功夫去推敲,总有可以优化的空间,就看你愿不愿意把事情做到极致。如果你内功不够深厚,理论知识不够扎实,那你就很难参透开源项目的代码到底优秀在哪里。就像如果我们没有之前的理论学习,没有今天一点一点重构、分析,只是给出最后重构好的代码,你真的能学到它的设计精髓吗?对比最开始小王写的代码和最终的,它们一个是能用,一个是好用,天壤之别。作为程序员,我们对代码要有追求哈。
2024-03-16 08:53:50 1032
原创 设计模式学习笔记 - 规范与重构 - 7.实践:通过一段ID生成器代码,学习如何发现代码质量问题
在软件开发中,ID 常用来表示一些业务信息的唯一标识,比如订单的单号、数据库中的唯一主键。假设你正参与一个后端业务系统的开发,为了方便在请求出错时排查问题,在写代码的时候会在关键路径上打印日志。某个请求出错后,希望能搜索出这个请求对应的所有日志。而实际情况是,在日志文件中,不同请求的日志会交织在一起。如果没有东西来标识哪些日志属于同一个请求,我们就无法关联同一个请求的所有日志。借助微服务调用链路追踪的实现思路,我们可以为每个请求分配一个唯一 ID,并保存在请求的上下文中(Context)。
2024-03-14 21:17:40 916
原创 设计模式学习笔记 - 规范与重构 - 6.快速改善代码质量的20条编程规范
命名的关键是能准确达意。对于不同作用域的命名,我们可以适当地选择不同的长度。可以借助类的信息来简化属性、函数的命名,利用函数的信息来简化函数参数的命名。命名要可读、可搜搜。不要使用生僻的、不好读的英文单词来命名。命名要符合项目的统一规范,也不要用些反直觉的命名。接口由两种命名方式:一种是在接口总带前缀 “I”;另一种是在接口的实现类中带后缀 “Impl”。对于抽象类,也有两种方式,一种是带上前缀 “Abstract”,一种是不带前缀。这两种都可以,关键是要在项目中统一。
2024-03-11 22:48:59 931
原创 设计模式学习笔记 - 规范与重构 - 5.如何通过封装、抽象、模块化、中间层解耦代码?
讲过,重构可以分为大规模高层重构(简称 “大型重构”)和小规模低层次重构(简称 “小型重构”)。大型重构是对系统、模块、代码结构、类之间关系等底层代码设计进行重构。对于大型重构来说,最有效的解决手段就是 “解耦”。解耦的目的是实现代码高内聚、松耦合。关于解耦,今天准备分三个部分来给你讲解。
2024-03-10 21:06:34 971
原创 设计模式学习笔记 - 规范与重构 - 3.什么是代码的可测试性?如何写出可测试性好的代码?
实际上,写单元测试不难,也不需要太多技巧,相反,写出可测试的代码反倒是件非常难的事情。所以,我们今天学下代码的可测试性相关知识。
2024-03-10 09:08:01 752
原创 设计模式学习笔记 - 规范与重构 - 2.单元测试-保证重构不出错的技术手段
那如何保证重构不出错呢?你需要掌握各种设计思想、设计原则、设计模式,还需要对所重构的业务和代码有足够的了解。除了这些个人能力因素外,最可落地执行、最有效的保证重构不出错的手段应该是单元测试了。当重构完成之后,如果新的代码仍然能通过单元测试,那就说明代码原有逻辑的正确性未被破坏,原有的外部可见行为未变。本文主要讨论单元测试的一些知识......
2024-03-09 18:28:32 946
原创 设计模式学习笔记 - 规范与重构 - 1.什么情况下要重构?重构什么?又该如何重构?
介绍重构的概念重构的目的,为什么重构(why);重构的对象,到底重构什么(what);重构的时机,什么时候重构(when);重构的方法,又该如何重构(how)。。
2024-03-09 11:48:54 832
原创 设计模式学习笔记 - 设计原则 - 10.实战:针对非业务的通用框架开发,如何做需求分析和设计及如何实现一个支持各种统计规则的性能计数器
对于非业务通用框架的开发,在做需求分析的时候,除了功能性的需求分析之外,还需要考虑框架的非功能性需求。比如,框架的易用性、性能、扩展性、容错性、通用性等。对于复杂框架的设计,很多人往往会觉得无从下手。画产品线框图聚焦简单的应用场景设计实现最小原型画系统设计图等。这些方法的目的都是为了让问题更加简化、具体、明确,提供一个迭代设计开发的基础,逐步推进。实际上,除了开发,其他任何事情,如果我们总是等所有的东西都想好了再开始,那这件事可能永远都开始不了。完事开头难,所以先迈出第一步很重要。
2024-03-08 14:04:28 846
原创 设计模式学习笔记 - 设计原则 - 9.实战:如何做需求分析和设计,以及如何设计一个遵从设计原则的积分兑换系统
对于一个开发人员而言,如果要追求长远发展,就不能一直把自己当做执行者,不能知识一个代码实现者,你还要有独立负责一个系统的能力,能端到端开发一个完整的系统。其中的工作包括前期沟通分析、中期的代码设计实现、后期的系统上线维护等。
2024-03-06 09:39:49 908
原创 设计模式学习笔记 - 设计原则 - 8.迪米特法则(LOD)
迪米特法则,是一个非常实用的原则。利用这个原则,可以帮我们实现代码的 “高内聚、松耦合”。
2024-03-03 23:01:15 836
原创 设计模式学习笔记 - 设计原则 - 7.DRY 原则及提高代码复用性
DRY 原则,英文描述为: Don't Repeat Yourself。中文直译:不要重复自己。将它应用在编程中,可理解为:不要写重读的代码。
2024-03-02 23:53:49 848
原创 设计模式学习笔记 - 设计原则 - 5.依赖反转原则(控制反转、依赖反转、依赖注入)
依赖反转原则是 SOLID 的最后一个原则,缩写为 DIP。它由四个主要特征:高层模块不依赖低层模块;高层模块和底层模块依赖同一个抽象;抽象不依赖具体实现细节;具体细节依赖抽象。
2024-03-02 10:46:43 856
原创 设计模式学习笔记 - 设计原则 - 4.接口隔离原则
如何理解接口隔离原则?理解接口隔离原则的重点是理解其中的“接口”二字。这里有三种不同的理解:把接口理解为一组接口集合;把接口理解为API 接口或函数;把接口理解为OOP 中的接口。
2024-03-02 00:00:06 1103
原创 设计模式学习笔记 - 设计原则 - 3.里氏替换原则,它和多态的区别是什么?
今天来学习 SOLID 中的 L:里氏替换原则。它的英文翻译是 Liskov Substitution Principle,缩写为 LSP。英文原话是: Functions that use points of references of base classes must be able to use objects of derived classes without knowing it。
2024-03-01 21:25:10 1165
原创 设计模式学习笔记 - 设计原则 - 2.开闭原则
今天学习 SOLID 中的第二个原则:开闭原则。他是 SOLID 中最难理解、最难掌握的,同时又是最有用的一条原则。在 23 种设计模式中,大部分设计模式都是为了解决代码的扩展性问题而存在的,主要遵从的设计原则就是开闭原则。
2024-02-29 22:14:41 773
原创 设计模式学习笔记 - 设计原则 - 1.单一职责原则
前面我们提到过 SOLID 原则,实际上 SOLID 由 5 个设计原则组成,分别是:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖反转原则。它们分别对应 SLOID 中的 S、O、L、I、D 这 5 个英文字母。今天来学习下 SOLID 原则中的第一个原则:单一职责原则。
2024-02-28 22:03:56 1134
原创 设计模式学习笔记 - 面向对象 - 7.为什么要多用组合少用继承?如何决定该用组合还是继承?
在面向对象编程中,有一条非常经典的设计原则:组合优于继承,多用组合少用继承。
2024-02-24 21:42:20 796
原创 设计模式学习笔记 - 面向对象 - 6.为什么要基于接口而非实现编程?有必要为每个类都定义接口吗?
“基于接口而非实现编程”这个原则非常重要,是一种非常有效的提高代码质量的手段,在平时的开发中经常被用到。
2024-02-23 22:54:29 884
原创 设计模式学习笔记 - 面向对象 - 5.接口和抽象类的区别
在面向对象编程中,抽象类和接口是常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则实现的基础。它们之间的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?
2024-02-22 23:37:19 1394
原创 设计模式学习笔记 - 面向对象 - 3.面向对象比面向过程有哪些优势?面向过程真的过时了吗?
如果你是一名比较资深的程序员,最开始学习编程的时候接触的是 Basic、C等面向过程的编程语言,那么你对这两个概念肯定不陌生。我们可以比对这面向对象编程和面向对象编程语言这两个概念来理解面向过程编程和面向过程编程语言。
2024-02-21 22:37:45 1000
WSL(Windows Subsystem for Linux)更新程序
2024-01-30
网页版进销存2.0系统文件.zip
2021-06-15
Android天气预报app源码
2017-12-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人