#设计模式/架构设计
文章平均质量分 95
各种设计模式、各种架构设计和一些常见的习惯用法
流星雨爱编程
记录工作的日常,心得体会
展开
-
设计模式之享元模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,通过使用共享对象来支持大量的细粒度对象,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。在享元模式中,有些对象可以被多个客户端共享,以减少创建对象的数量。享元模式的核心在于享元工厂类,它负责创建和管理享元对象,并提供对外访问的接口。(1) 减少内存占用:享元模式通过共享相同或相似的对象,避免了大量相同对象的重复创建,从而显著降低了系统的内存占用。(2) 提高系统性能。原创 2024-05-20 22:21:49 · 602 阅读 · 0 评论 -
重构四要素:目的、对象、时机和方法
一些软件工程师对为什么要重构(why)、到底重构什么(what)、什么时候重构(when)应该如何重构(how)等问题的理解不深,对重构没有系统行认识、在面对质量不佳的代码时,这些软件工程师没有足够的重构技巧,不能系统地进行重构、为了让读者对有清晰的认识,我们先来了解一下重构的目的、对象、时机和方法。原创 2024-05-13 21:46:01 · 670 阅读 · 20 评论 -
设计模式之访问者模式
扩展性:访问者模式使得在不修改已有类的情况下,可以轻松地增加新的操作。这符合开放-封闭原则(Open-Closed Principle),即对扩展开放,对修改封闭。分离操作与数据结构:访问者模式将操作从数据结构中分离出来,使得数据结构可以独立地变化,而无需修改相关的操作。这有助于减少代码的耦合度,提高系统的可维护性。灵活性:访问者模式允许操作以不同的方式实现,而不影响数据结构。这提供了更大的灵活性,可以根据需要选择不同的操作实现。双重分派。原创 2024-05-11 22:36:09 · 812 阅读 · 7 评论 -
面向对象编程与面向过程编程和函数式编程之间的区别
是现在流行的编程范式(编程风格)。。随着面向对象编程的出现,面向过程编程已经逐渐退出了历史舞台,函数式编程目前还没有被程序员广泛接受,只能作为面向对象编程的补充。为了更好地理解面向对象编程,我们在本节中补充讲解面向过程编程和函数式编程,并且将面向对象编程与面向过程编程和函数式编程进行对比。原创 2024-05-07 22:49:49 · 842 阅读 · 8 评论 -
设计模式之外观模式
优点1)降低耦合度:即减少相互依赖,客户端与子系统之间的耦合度降低,客户端只与外观角色交互,不需要了解子系统的具体实现。2)简化操作:客户端不再需要了解子系统的内部实现和具体细节,只需要与外观角色交互,简化了客户端的操作。3)易于维护:当子系统内部发生变化时,只需要修改外观角色,而不需要修改客户端代码,降低了维护成本。缺点1)不符合“开闭原则”:如果新增子系统或删除子系统,可能需要修改外观角色的代码,这在一定程度上违反了“开闭原则”。原创 2024-05-05 22:51:03 · 1132 阅读 · 13 评论 -
如何进行面向对象分析、面向对象设计和面向对象编程
假设我们正在参与一个微服务的开发。微服务通过 HTTP 暴露接口给其他系统调用,换句话说,其他系统通过 URL调用微服务的接口。某天,项目管理者对我们说:“为了保证接口调用的安全性,需要设计和实现接口调用的鉴权功能,只有经过认证的系统,才能调用微服务的接口。希望你们负责这个任务,争取尽快上线这个功能。”这个时候,我们可能感到无从下手原因有下列两点。(1)需求不明确项目管理者提出的需求有些模糊和笼统,不够具体和细化,与落地进行设计和编码还有一定的距离。原创 2024-04-30 21:56:18 · 1116 阅读 · 9 评论 -
C++可变参数接口,批量写入和读取参数值的设计和实现
最近在做项目的时候,我们小组做的模块和另外一个小组做的模块的交付通过动态库接口的方式,他们有一个接口是这样的定义的:name是参数名称,data为序列化的字节数据,小端对齐,数据类型包括一般数据类型int、long、double等;复杂数据类型包括原生数组、结构体、类等。例如:单个参数的配置和读取都很简单,利用之前章节介绍的序列化类,参数配置可以这样写:参数1(int)的配置代码如下:参数2(bool)的配置代码如下:参数3(double)的配置代码如下:参数4(int[10])的配原创 2024-04-29 00:03:48 · 752 阅读 · 5 评论 -
MYQSL基于C++的数据库连接池设计与实现
数据库连接池可提前把多个数据库连接建立起来,然后把它放到一个池子里边,就是放到一个容器里边进行维护。这样的话就能够避免数据库连接的频繁的创建和销毁,从而提高程序的效率。线程池其实也是同样的思路,也是为了避免线程的重复的创建和销毁。这个图模拟的是一个网络通信,在左侧有多个客户端,客户端给服务器发数据,发数据可以理解为就是发送一个请求,比如说请求登录,请求注册,请求下载或者上传某些文件。我们还需要做身份的验证,或者说做数据的读和写操作,那这个数据在哪里呢?原创 2024-04-27 09:05:27 · 762 阅读 · 6 评论 -
组合优于继承:什么情况下可以使用继承?
面向对象编程中有一条经典的设计原则:组合优于继承,也常被描述为多用组合,少用继承。为什么不推荐使用继承?相比继承,组合有哪些优势?如何决定是使用组合还是使用继承?本节围绕这3个问题详细讲解这条设计原则。原创 2024-04-25 23:25:47 · 942 阅读 · 6 评论 -
设计模式之原型模式
原型模式的优点:便于通过克隆方式创建复杂对象、也可以避免重复做初始化操作.不需要与类中所属的其他类耦合等。如果对象中包括了循环引用的克隆,以及类中深度使用对象的克隆,都会使此模式变得异常麻烦。综上所述,原型设计模式在特定场景下具有显著的优势,但也需要注意其潜在的缺点和限制。在选择是否使用原型设计模式时,需要根据具体的应用场景和需求进行权衡。原创 2024-04-23 22:03:12 · 1379 阅读 · 9 评论 -
设计模式之责任链模式(二): 实现方式
尽管我们给出了典型的职责链模式的代码实现,但在实际的开发中,我们还是要具体问题具体对待,因为职责链模式的代码实现会根据需求的不同而有所变化。实际上,这一点对于有设计模式都适用。原创 2024-04-23 13:02:05 · 1367 阅读 · 3 评论 -
编程技巧:小技巧,大作用,一招提高代码的可读性
拆分之后的函数的职责明确。根据作者的经验,函数的参数一般超过5个就算过多了,因为函数参数超过5个之后,在调用函数时,调用语句容易超出一行代码的长度,要将其分为两行甚至多行,导致代码的可读性降低。在编写代码时,我们要有模块化思维,善于将大块的复杂的代码封装成类或函数,让阅读代码的人不会迷失在代码的细节中,这样能极大地提高代码的可读性。如果导致函数的参数过多的原因是函数的职责不单一,那么我们可以通过将这个函数拆分成多个函数的方式来减少参数。4)我们可以将部分嵌套代码封装成函数,以减少嵌套层数,示例代码如下。原创 2024-04-17 22:38:27 · 923 阅读 · 10 评论 -
LoD:如何实现代码的“高内聚、低耦合“
单从"LoD"这个名字来看,我们完全猜不出这条设计原则讲的是什么。其实,LoD还可以称为“最少知识原则”(The Least Knowledge Principle)。“最少知识原则”的英文描述是:“Each unit should have only limited knowledge about other units;原创 2024-04-16 20:22:48 · 982 阅读 · 3 评论 -
DRY 原则:相同的两段代码就一定违反 DRY 原则吗?
DRY 原则(Don't Repeat Youself)翻译成中文是:不要编写重复的代码。很多人对其中的“重复”二字有误解,认为项目中存在两段相同的代码就是重复,实际上,相同的两段代码未必违反 DRY原则,相反,不同的两段代码也未必就不违反DRY 原则。本节我们就重点来讲一下怎么才算是“重复”。原创 2024-04-12 20:50:54 · 766 阅读 · 0 评论 -
KISS 原则和 YAGNI原则
KISS原则的英文描述有3种版本:Keep It Simple and Supid、 keep It Short and Simple、Keep It Simple and Straightforward。其实,它们要表达的意思差不多,即“尽量保持简单”。KISS原则是一个“万金油”一样的设计原则,可以应用在诸多场合。它不仅经常用来指导软件开发,还经常用来指导系统设计、产品设计等,如冰箱、建筑和手机的设计等,本书讲解的是代码设计,因此,接下来,我们重点讲解如何在程序开发中应用KISS 原则。原创 2024-04-10 21:57:51 · 1111 阅读 · 0 评论 -
编程大牛坚持了 10 年的 10 个编程好习惯
之所以要写注释,是因为当你在写某个程序的时候,可能当下记得很清楚,这一段是什么机制、如何实现,但是当你写的程序越来越多,你会忘记当初为什么这样写,改动和交接也十分麻烦,对代码进行注释就可以有效避免这种情况。编写官方文档的人,也通常就是这些技术或者软件的开发者,他们是对这些东西最了解的人,所以编写的文档不仅质量非常高,通常内容也都是最新的。了解开源项目:许多优秀的软件项目都是开源的,通过阅读这些项目的源代码,你可以更深入地了解它们的工作原理、架构设计和实现细节。写一天代码,70%的时间都放到重构上都不过份。原创 2024-04-05 22:46:04 · 757 阅读 · 6 评论 -
面向对象设计之开闭原则
开闭原则(Open Closed Principle,OCP),又称为“对扩展开发、对修改关闭”原则。开闭原则既是 SOLID 原则中最难理解、最难掌握的,又是最有用的。之所以说开闭原则难理解,是因为“怎样的代码改动才被定义为'扩展’?怎样的代码改动才被定义为'修改’?怎么才算满足或违反'开闭原则’?修改代码就一定意味着违反'开闭原则’吗?”等问题都比较难理解。之所以说开闭原则难掌握,是因为“如何做到'对扩展开发、对修改关闭’?如何在项目中灵活应用'开闭原则’,避免在追求高扩展性的同时影响代码的可读性?”等原创 2024-04-01 21:25:09 · 686 阅读 · 1 评论 -
如何避免过度设计
总之,避免过度设计需要保持清晰的目标、关注用户需求、简化设计、避免过早优化,并持续学习和改进。通过遵循这些原则和建议,你可以有效地避免过度设计,提高项目的成功率和效率。原创 2024-03-29 11:04:58 · 1302 阅读 · 6 评论 -
如何写出高质量代码
想要写出满足上述代码质量评价标准的高质量代码,我们需要掌握一些细化、可落地的编程方法论,包括面向对象设计范式、设计原则、代码规范、重构技巧和设计模式等。而掌握这些编程方法论的最终目的是编写出高质量的代码。这些编程方法论是后续讲解的重点内容,我们先熟悉一下它们。原创 2024-03-27 22:51:53 · 1051 阅读 · 17 评论 -
如何评价代码质量
在评价代码质量时,可以使用静态代码分析工具来自动检查代码中的潜在问题,如语法错误、未使用的变量、潜在的空指针异常等。此外,代码审查也是一个重要的环节,通过团队成员的互相审查可以发现潜在的问题和改进点。最终,代码质量的评价是一个主观与客观相结合的过程,需要综合考虑上述多个方面,并根据项目的具体需求和团队的实际情况进行判断和评估。原创 2024-03-25 23:08:14 · 707 阅读 · 11 评论 -
设计模式之状态模式(一)
优点清晰的结构和逻辑:状态机模式使得对象的行为与其状态紧密相关,使得代码结构更加清晰,逻辑更加明确。每个状态及其转换都被明确地定义和封装,使得程序易于理解和维护。扩展性好:当需要添加新的状态或修改现有状态的行为时,只需要添加新的状态类或者修改现有状态类的实现,而不需要修改上下文或其他状态类的代码。这降低了代码的耦合度,提高了系统的可扩展性。减少条件分支:状态机模式通过将状态转换逻辑封装在状态类中,减少了在上下文中使用大量的条件分支(如if-else或switch-case)的情况。原创 2024-03-24 13:17:48 · 1142 阅读 · 7 评论 -
面向对象设计之单一职责原则
单一职责原则(Single Responsibility Principle,SRP)的描述:一个类或模块只负责完一个职责(或功能)(A class or module should have a single reponsibility)。注意,单一职责原则描述的对象有两个:类(class)和模块(module)。关于这两个概念我们有两种理解方式。一种理解方式是把模块看作比类更加抽象的概念,把类看作一种模块;另一种理解方式是把模块看作比类更粗粒度的代码块,多个类组成一个块。原创 2024-03-19 22:54:46 · 1250 阅读 · 4 评论 -
面向对象设计之依赖反转原则
依赖反转是面向对象设计的基本原则之一。这个原则强调高层模块不应该依赖于低层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这有助于降低模块间的耦合度,提高系统的可维护性和可扩展性。1.接口和抽象类:通过定义接口或抽象类来隐藏具体实现细节,高层模块依赖于这些接口或抽象类,而不是具体的实现类。这样,当需要更换底层实现时,只需要修改接口或抽象类的实现,而不需要修改高层模块的代码。2.依赖注入:通过构造函数、setter方法或接口注入等方式,将依赖的对象传递给需要它的对象。原创 2024-03-12 22:02:40 · 994 阅读 · 13 评论 -
面向对象设计之里氏替换原则
里氏替换原则(Liskov Substitution principle)是由芭芭拉·利斯科夫(Barbara Liskov)在1987年在一次会议上名为“数据的抽象与层次”的演说中首先提出。他当时是这样描述这条原则的:如果S是T的子类型,那么T的对象可以被S的对象所替换,并不影响代码的运行。1966年,Robert Martin在他的SOLID原则中重新描述了里氏替换原则:使用父类对象的函数可以在不了解子类的情况下替换为使用子类对象。原创 2024-03-10 17:20:34 · 1160 阅读 · 15 评论 -
设计模式之中介者模式
优点1.简化对象交互:中介者模式通过引入中介者对象,将原本多个对象之间的复杂交互关系转化为中介者与对象之间的一对多交互,从而简化了对象之间的交互关系。这使得原本网状结构的交互关系变为星型结构,使得代码更易于理解和维护。2.降低耦合度:通过中介者模式,对象之间的直接依赖关系被转化为对中介者的依赖,从而降低了对象之间的耦合度。这使得对象更易于独立地改变和复用,符合面向对象设计的“开闭原则”。3.集中控制:中介者模式将多个对象之间的交互行为集中到一个中介者对象中,使得这些行为的控制和管理更加集中和方便。原创 2024-03-10 13:40:17 · 1305 阅读 · 6 评论 -
设计模式之模板方法模式
优点1.代码复用:模板方法模式允许你定义一个算法的基本步骤,并且允许子类在不改变算法结构的情况下重定义某些步骤。这样可以避免子类代码中重复的代码,提高了代码的复用性。2.封装不变部分:模板方法模式封装了算法的不变部分,使得算法的核心逻辑得到保护不会被错误地修改。3.扩展性:由于算法的核心逻辑已经被封装在模板方法中,因此当需要增加新的步骤或者修改某些步骤时,只需要在相应的子类中实现或修改对应的方法,而不需要修改模板方法,具有良好的扩展性。原创 2024-03-08 13:12:30 · 1487 阅读 · 14 评论 -
设计模式之代理模式
优点1.解耦:代理模式能够解耦客户端和目标对象之间的直接交互,客户端只需要与代理对象交互,而个需要知道自标对象的体实现这有助于降低系统的耦合度,使得系统更加灵活和可扩展。2.增加额外的处理逻辑:代理对象可以在将请求传递给目标对象之前或之后:添加额外的处理逻辑。这可以用于实现一些特殊的功能,如访问控制、缓存、日志记录等3.保护目标对象:代理模式可以保护目标对象,避免其被直接访问或暴露。这可以防证目标对象被恶意访问或修改,提高系统的安全性。缺点。原创 2024-03-07 09:36:44 · 1058 阅读 · 16 评论 -
设计模式之命令模式
优点1.解耦:命令模式将请求的发送者和接收者解耦,请求的发送者不需要知道接收者的具体实现细节,只需要通过命令对象来发送请求。2.可撤销操作:命令模式支持可撤销的操作,通过将命令对象存储在历史记录中或者在命令对象中实现撤销操作,可以实现操作的撤销。3.日志记录:命令模式可以方便地记录请求的历史,例如将命令对象存储在日志中以便于后续的审计和回溯。4.支持事务:命令模式可以支持事务,通过将多个命令组合成一个更大的操作,可以保证这些命令要么全部执行,要么全部不执行。原创 2024-02-22 16:16:30 · 1691 阅读 · 13 评论 -
设计模式之组合模式
优点1)更好的扩展性:组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码。2)更好的复用性:更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。缺点:1)设计较复杂:客户端需要花更多时间理清类之间的层次关系。2)不容易限制容器中的构件:不容易用继承的方法来增加构件的新功能3)叶子和树枝的声明都是实现类,违反了依赖倒置原则。原创 2024-02-01 18:52:41 · 1536 阅读 · 23 评论 -
设计模式之策略模式
优点:1) 灵活性和可扩展性:策略模式提供了一种灵活的机制来改变对象的行为。通过使用不同的策略类,可以在不修改原有代码的基础上,方便地增加新的策略。这有助于保持软件的可扩展性和灵活性。2) 消除条件语句:策略模式通过消除显式的条件语句(如if-else或switch-case语句),使得代码更加简洁易读。客户端只需要与抽象的策略接口交互,而无需关心具体的实现细节。3) 更好的组织代码:策略模式有助于将相关的算法和行为组织在一起,形成独立的策略类。这有助于提高代码的组织性和可维护性。原创 2024-01-27 07:07:36 · 1552 阅读 · 24 评论 -
设计模式之责任链模式(一)
1) 解耦责任链模式将请求的发送者和接收者解耦,请求的发送者不需要知道接收者是谁,也不需要创建接收者的实例。同时,接收者也不需要知道请求的具体内容,只需要按照自已的业务逻辑进行相应的处理。这种解耦方式使得系统更加灵活,降低了耦合度,方便进行模块化开发和测试。2) 链式处理:责任链模式可以形成一个处理链,请求在这个链中传递,每个节点都会对请求进行处理,这种方式可以实现复杂的业务逻辑,提高系统的可扩展性和可维护性。原创 2024-01-25 22:38:00 · 1431 阅读 · 14 评论 -
设计模式之桥接模式
优点:1) 抽象与实现分离这也是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。2) 降低了系统的耦合度由于抽象和实现是分开的,因此抽象和实现之间的耦合度大大降低,这使得代码更容易维护和修改。3) 提高了代码的可读性和可维护性由于抽象和实现是分开的,因此代码的结构更加清晰,可读性和可维护性更高。4) 增加了代码的重用性。原创 2024-01-24 22:46:50 · 1167 阅读 · 13 评论 -
设计模式之装饰器模式
使用装饰器模式的好处:1)可以在运行时动态的添加或删除功能。2)可以递归地组合多个装饰器,从而创建复杂的对象。3)可以使用不同的装饰器组合来创建不同的行为。4)可以在不修改原有代码的情况下增加新功能。总体来说,装饰器模式是一种强大且灵活的设计模式,它可以用于创建可扩展、可定制和可组合的对象。原创 2024-01-22 08:00:00 · 1438 阅读 · 7 评论 -
设计模式之工厂模式
工厂模式也是平时我们编程用的比较多的一种行为设计模式,它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。工厂模式属于创建型模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离。原创 2024-01-15 13:13:56 · 1299 阅读 · 4 评论 -
设计模式之空对象模式
空对象模式也是我们平时编程用的比较多的一种行为型设计模式,它的宗旨在解决空对象引起的异常报错问题;在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。原创 2024-01-11 12:54:40 · 1771 阅读 · 4 评论 -
设计模式之观察者模式
观察者模式是我们日常用的比较多的一种行为设计模式,有时又被称为发布Publish-订阅Subscribe模式、模型model-视图View模式、源-收听者Listener模式或从属者模式;在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。原创 2024-01-10 23:09:29 · 1221 阅读 · 0 评论 -
设计模式之单例模式
private:public://加互斥锁private:public:private:private:public:if (!//加互斥锁if (!});private:关于自定义销毁器还有不明白的地方,可以查看我的另外一篇博客C++智能指针的自定义销毁器(销毁策略)_51如何销毁指针-CSDN博客。原创 2024-01-07 15:05:32 · 1530 阅读 · 1 评论 -
设计模式之过滤器模式
负责定义过滤器的实现接口,具体的实现还要具体过滤器角色去参与,客户端可以调用抽象过滤器角色中定义好的方法,将客户端的所有请求委派到具体的实现类去,从而让实现类去处理;原创 2024-01-05 15:41:00 · 837 阅读 · 2 评论 -
设计模式之适配器模式
适配器就是将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作,它包括类适配器和对象适配器;通俗的讲,比如自己有一套现成的比较成熟接口给客户提供,有个客户想使用我们的功能接口,但是他们系统现成的接口和我们提供的接口不一样,此时适配器模式就派上用场了,一种可行的方案就是在我们接口功能的基础上封装成客户的接口提供给他们使用。对象适配器的类图如下:类适配器的类图如下:适配器模式包含如下角色:• Target:目标抽象类• Adapter:适配器类。原创 2023-12-17 22:19:45 · 1314 阅读 · 1 评论 -
设计模式之迭代器模式
1、迭代器简化了聚合的接口有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了,这样就简化了聚合的接口。2、在同一个聚合上可以有多个遍历每个迭代器保持它自已的遍历状态,因此你可以同时进行多个遍历3、它支持以不同的方式遍历一个聚合复杂的聚合可用多种方式进行遍历,如二叉树的遍历,可以采用前序、中序或后序遍历。送代器模式使得改变遍历算法变得很容易:仅需用一个不同的迭代器的实例代替原先的实例即可,你可以自已定义迭代器的子类以支持新的遍历,或者可以在遍历中增加一些逻辑,如有条件的遍历等等。原创 2023-12-24 22:30:15 · 1700 阅读 · 2 评论