- 博客(29)
- 收藏
- 关注
原创 【C++】十大排序算法之 插入排序 & 希尔排序
将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。(即只需用到 O(1) 的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。:“桶”的个数(上面的三种非比较类排序都是基于“桶”的思想实现的)。,所比较快,因为相比冒泡排序,每次交换是跳跃式的。
2024-03-04 20:30:19
1122
原创 C++设计模式之访问者模式
访问者模式(Visitor Pattern)是⼀种行为型设计模式,可以在不改变对象结构的前提下,对对象中的元素进行新的操作。
2024-01-26 18:33:35
1644
原创 C++ 设计模式之解释器模式
解释器模式(Interpreter Pattern)是⼀种行为型设计模式,它定义了⼀个语⾔的⽂法,并且建⽴⼀个【解释器】来解释该语⾔中的句子。
2024-01-26 11:00:23
2236
原创 C++ 设计模式之责任链模式
-什么是责任链模式(第21种设计模式)责任链模式是⼀种行为型设计模式,它允许你构建⼀个对象链,让请求从链的⼀端进⼊,然后沿着链上的对象依次处理,直到链上的某个对象能够处理该请求为止。职责链上的处理者就是⼀个对象,可以对请求进⾏处理或者将请求转发给下⼀个节点,这个场景在⽣活中很常⻅,就是⼀个逐层向上递交的过程,最终的请求要么被处理者所处理,要么处理不了,这也因此可能导致请求⽆法被处理。【组成结构】1.处理者Handler:定义⼀个处理请求的接⼝,包含⼀个处理请求的抽象⽅法和⼀个指向下⼀个处理者的链接。
2024-01-25 11:45:00
1658
原创 C++设计模式之状态模式
-- 第20种设计模式; 状态模式(State Pattern)是⼀种行为型设计模式,它适⽤于⼀个对象在不同的状态下有不同的行为时,⽐如说电灯的开、关、闪烁是不停的状态,状态不同时,对应的行为也不同,在没有状态模式的情况下,为了添加新的状态或修改现有的状态,往往需要修改已有的代码,这违背了开闭原则,而且如果对象的状态切换逻辑和各个状态的行为都在同⼀个类中实现,就可能导致该类的职责过重,不符合单⼀职责原则。
2024-01-24 12:00:02
2198
1
原创 C++设计模式之迭代器模式
迭代器模式是⼀种行为设计模式,是⼀种使⽤频率⾮常⾼的设计模式,在各个语⾔中都有应用,其主要⽬的是提供⼀种统⼀的⽅式来访问⼀个聚合对象中的各个元素,而不需要暴露该对象的内部表示。通过迭代器,客户端可以顺序访问聚合对象的元素,而无需了解底层数据结构。
2024-01-23 15:46:15
1543
1
原创 C++设计模式之 模板方法模式
-什么是模板方法模式(第18种设计模式)模板方法模式(Template Method Pattern)是⼀种行为型设计模式, 它定义了⼀个算法的骨架,将⼀些步骤的实现延迟到⼦类。模板方法模式使得⼦类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。准备⻝材亨饪过程上菜不同菜品的亨饪过程是不⼀样的,但是我们可以先定义⼀个”⻣架”,包含这三个步骤,亨饪过程的过程放到具体的炒菜类中去实现,这样,⽆论炒什么菜,都可以沿⽤相同的炒菜算法,只需在⼦类中实现具体的炒菜步骤,从而提⾼了代码的复⽤性。
2024-01-20 17:25:20
1683
原创 C++ 设计模式之备忘录模式
对于每个 "Increment" 和 "Decrement" 操作,输出当前计数器的值,计数器数值从0开始 对于每个 "Undo" 操作,输出撤销后的计数器值。输入包含若干行,每行包含一个字符串,表示计数器应用的操作,操作包括 "Increment"、 "Decrement"、"Undo" 和 "Redo"。备忘录有两个接⼝,发起⼈能够通过宽接⼝访问数据,管理者只能看到窄接⼝,并将备忘录传递给其他对象。UndoManager 和UndoableEdit 接⼝是与备忘录模式相关的主要类和接⼝。
2024-01-19 21:21:47
1941
3
原创 C++ 设计模式之命令模式
命令模式同样有着很多现实场景的应用,⽐如Git中的很多操作,如提交(commit)、合并(merge)等,都可以看作是命令模式的应⽤,用户通过执⾏相应的命令来操作版本库。例如,每个按钮都有⼀个关联的 Action ,它代表⼀个命令,按钮的点击触发 Action 的执⾏。举个现实中的应⽤场景,遥控器可以控制不同的设备,在命令模式中,可以假定每个按钮都是⼀个命令对象,包含执⾏特定操作的命令,不同设备对同⼀命令的具体操作也不同,这样就可以⽅便的添加设备和命令对象。等情况下,都是⼀个有效的设计模式。
2024-01-17 11:19:34
1771
原创 C++ 设计模式之策略模式
举个例⼦,电商⽹站对于商品的折扣策略有不同的算法,⽐如新⽤户满减优惠,不同等级会员的打折情况不同,这种情况下会产⽣⼤量的if-else语句, 并且如果优惠政策修改时,还需要修改原来的代码,这就可以将不同的优惠算法封装成独⽴的类来避免⼤量的条件语句,如果新增优惠算法,可以添加新的策略类来实现,客户端在运⾏时选择不同的具体策略,⽽不必修改客户端代码改变优惠策略。小明家的超市推出了不同的购物优惠策略,你可以根据自己的需求选择不同的优惠方式。,它定义了⼀系列算法(这些算法完成的是相同的⼯作,只是实现不同),并。
2024-01-16 16:01:38
1849
1
原创 C++ 设计模式之观察者模式
主题只需要关注⾃⼰的状态变化,⽽观察者只需要关注在主题状态变化时需要执⾏的操作,两者互不⼲扰,并且由于观察者和主题是相互独⽴的,可以轻松的增加和删除观察者,这样实现的系统更容易扩展和维护。小明所在的学校有一个时钟(主题),每到整点时,它就会通知所有的学生(观察者)当前的时间,请你使用观察者模式实现这个时钟通知系统。,让多个观察者对象同时监听⼀个主题对象,当主题对象的状态发⽣变化时,所有依赖于它的观察者都得到通知并被⾃动更新。使⽤观察者模式有很多好处,⽐如说观察者模式将主题和观察者之间的。
2024-01-15 15:37:59
1364
原创 C++ 设计模式之组合模式
理解起来⽐较抽象,我们⽤“省份-城市”举个例⼦,省份中包含了多个城市,如果将之⽐喻成⼀个树形结构,城市就是叶⼦节点,它是省份的组成部分,⽽“省份”就是合成节点,可以包含其他城市,形成⼀个整体,省份和城市都是组件,它们都有⼀个共同的操作,⽐如获取信息。组合模式可以使得客户端可以统⼀处理单个对象和组合对象,⽆需区分它们之间的差异,⽐如在图形编辑器中,图形对象可以是简单的线、圆形,也可以是复杂的组合图形,这个时候可以对组合节点添加统⼀的操作。输出公司的组织结构,展示每个部门下的子部门和员工。
2024-01-12 10:54:11
1430
原创 C++ 设计模式之桥接模式
再举个例⼦,遥控器就是抽象接⼝,它具有开关电视的功能,修正抽象就是遥控器的实例,对遥控器的功能进⾏实现和扩展,⽽电视就是实现接⼝,具体品牌的电视机是具体实现,遥控器中包含⼀个对电视接⼝的引⽤,通过这种⽅式,遥控器和电视的实现被分离,我们可以创建多个遥控器,每个遥控器控制⼀个品牌的电视机,它们之间独⽴操作,不受电视品牌的影响,可以独⽴变化。,它的UML图很像⼀座桥,它通过将【抽象部分】与【实现部分】分离,使它们可以独⽴变化,从⽽达到。桥接模式的主要⽬的是通过组合建⽴两个类之间的联系,⽽不是继承的⽅式。
2024-01-11 21:06:48
1385
原创 C++ 设计模式之外观模式
举个例⼦,假设你正在编写的⼀个模块⽤来处理⽂件读取、解析、存储,我们可以将这个过程拆成三部分,然后创建⼀个外观类,将⽂件系统操作、数据解析和存储操作封装在外观类中,为客户端提供⼀个简化的接⼝,如果后续需要修改⽂件处理的流程或替换底层⼦系统,也只需在外观类中进⾏调整,不会影响客户端代码。外观模式通过提供⼀个简化的接⼝,隐藏了系统的复杂性,降低了客户端和⼦系统之间的耦合度,客户端不需要了解系统的内部实现细节,也不需要直接和多个⼦系统交互,只需要通过外观接⼝与外观对象进⾏交互。, 也被称为“⻔⾯模式”,是⼀种。
2024-01-11 16:08:40
1295
原创 C++ 设计模式之装饰模式
BufferedOutputStream 这两个类提供了缓冲区的⽀持,通过在底层的输⼊流和输出流上添加缓冲区,提⾼了读写的效率,它们都是InputStream 和OutputStream 的装饰器。举个简单的例⼦,假设你有⼀个基础的图形类,你想要为图形类添加颜⾊、边框、阴影等功能,如果每个功能都实现⼀个⼦类,就会导致产⽣⼤量的类,这时就可以考虑使⽤装饰模式来动态地添加,⽽不需要修改图形类本身的代码,这样可以使得代码更加灵活、更容易维护和扩展。根据每行输入,输出制作咖啡的过程,包括咖啡类型和添加的调料。
2024-01-11 11:59:14
1288
原创 C++ 设计模式之代理模式
⽐如说有⼀个⽂件加载的场景,为了避免直接访问“⽂件”对象,我们可以新增⼀个代理对象,代理对象中有⼀个对“⽂件对象”的引⽤,在代理对象的 load ⽅法中,可以在访问真实的⽂件对象之前进⾏⼀些操作,⽐如权限检查,然后调⽤真实⽂件对象的 load ⽅法,最后在访问真实对象后进⾏其他操作,⽐如记录访问⽇志。代理模式可以控制客户端对真实对象的访问,从⽽限制某些客户端的访问权限,此外代理模式还常⽤在访问真实对象之前或之后执⾏⼀些额外的操作(⽐如记录⽇志),对功能进⾏扩展。代理模式的主要⽬的是控制对对象的访问。
2024-01-10 16:08:23
1381
原创 C++ 设计模式之适配器模式
小明购买了一台新电脑,该电脑使用 TypeC 接口,他已经有了一个USB接口的充电器和数据线,为了确保新电脑可以使用现有的USB接口充电器和数据线,他购买了一个TypeC到USB的扩展坞。请你使用适配器模式设计并实现这个扩展坞系统,确保小明的新电脑既可以通过扩展坞使用现有的USB接口充电线和数据线,也可以使用TypeC接口充电。(可以把适配器模式理解成拓展坞,起到转接的作⽤,原有的接⼝是USB,但是客户端需要使⽤type-c , 便使⽤拓展坞提供⼀个type-c 接⼝给客户端使⽤)方法一为普通的直接调用;
2024-01-10 10:48:05
1697
原创 C++ 设计模式之原型模式
实现原型模式需要给【原型对象】声明⼀个克隆⽅法,执⾏该⽅法会创建⼀个当前类的新对象,并将原始对象中的成员变量复制到新⽣成的对象中,⽽不必实例化。如果⼀个对象的创建过程⽐较复杂时(⽐如需要经过⼀系列的计算和资源消耗),那每次创建该对象都需要消耗资源,⽽通过原型模式就可以复制现有的⼀个对象来迅速创建/克隆⼀个新对象,、并且可以通过克隆避免重复初始化⼯作的场景时可以考虑使⽤原型模式,在克隆对象的时候还可以动态地添加或删除原型对象的属性,创造出相似但不完全相同的对象,提⾼了灵活性。,⽽不是从头开始创建。
2024-01-09 20:44:36
1398
原创 C++ 设计模式之建造者模式
每个组件可能有不同的型号、配置和制造,这个时候计算机就可以被视为⼀个复杂对象,构建过程相对复杂,⽽我们使⽤建造者模式将计算机的构建过程封装在⼀个具体的建造者类中,⽽指导者类则负责指导构建的步骤和顺序。同时有⼀个指导者类负责协调建造者的⼯作,按照⼀定的顺序或逻辑来执⾏构建步骤,最终⽣成产品。对应的,建造者模式适⽤于复杂对象的创建,当对象构建过程相对复杂时可以考虑使⽤建造者模式,但是当产品的构建过程发⽣变化时,可能需要同时修改指导类和建造者类,这就使得重构变得相对困难。
2024-01-09 11:01:32
1182
原创 C++ 设计模式之抽象工厂模式
抽象⼯⼚模式可以确保⼀系列相关的产品被⼀起创建,这些产品能够相互配合使⽤,再举个例⼦,有⼀些家具,⽐如沙发、茶⼏、椅⼦,都具有古典⻛格的和现代⻛格的,抽象⼯⼚模式可以将⽣产现代⻛格的家具放在⼀个⼯⼚类中,将⽣产古典⻛格的家具放在另⼀个⼯⼚类中,这样每个⼯⼚类就可以⽣产⼀系列的家具。但是如果有多类产品呢,⽐如说“⼿机”,⼀个品牌的⼿机有⾼端机、中低端机之分,这些具体的产品都需要建⽴⼀个单独的⼯⼚类,但是它们都是相互关联的,都共同属于同⼀个品牌,这就可以使⽤到【抽象⼯⼚模式】。【声明】本编码题目来源于【
2024-01-08 10:31:13
1172
1
原创 C++ 设计模式之简单工厂模式
⼯⼚⽅法模式使得每个⼯⼚类的职责单⼀,每个⼯⼚只负责创建⼀种产品,当创建对象涉及⼀系列复杂的初始化逻辑,⽽这些逻辑在不同的⼦类中可能有所不同时,可以使⽤⼯⼚⽅法模式将这些初始化逻辑封装在⼦类的⼯⼚中。简单⼯⼚类简化了客户端操作,客户端可以调⽤⼯⼚⽅法来获取具体产品,⽽⽆需直接与具体产品类交互,降低了耦合,但是有⼀个很⼤的问题就是不够灵活,如果需要添加新的产品,就需要修改⼯⼚类的代码。简单⼯⼚模式包括三个主要⻆⾊,⼯⼚类、抽象产品、具体产品,下⾯的图示则展示了⼯⼚类的基本结构。【声明】本课题来源参考卡码网【
2024-01-06 15:36:26
399
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人