- 博客(25)
- 收藏
- 关注
原创 Socket编程——TCP通信与UDP通信
TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol ,用户数据报协议)都属于TCP/IP协议簇。其中,TCP是面向连接的协议,在数据传输之前必须通过"三次握手"与对方建立可靠的连接,当数据传输完毕后通过"四次挥手"与服务端断开连接,这样可以保证数据传输的可靠性。也正是其的可靠性,TCP通信经常用于需要保证网络通信内容完整性的情况,比如网页HTTP、QQ文件传输等过程。
2022-12-19 21:41:51 924 1
原创 设计模式【23】——解释器模式(Interpreter模式)
一些应用提供了内建(Build-In)的脚本或者宏语言来让用户可以定义他们能够在系统中进行的操作。Interpreter模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过解释器来解释语言中的句子。Interpreter模式提供了一个实现语法解释器的框架。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
2022-12-09 22:00:03 457
原创 设计模式【22】——迭代器模式(Iterator 模式)
Iterator 模式十分常见。当我们开发cpp文件时,经常会使用STL里面的容器,如vector、map、set等,对容器进行遍历的时候就用到了里面提供的Iterator来遍历数据结构。Iterator模式也正是用来解决对一个聚合对象的遍历问题。其将对聚合的遍历封装到一个类中进行,这样就避免了暴露这个聚合对象的内部表示的可能。Iterator 模式中迭代器简化了聚合类,支持以不同的方式遍历一个聚合对象。而且增加新的聚合类和迭代器类都很方便,无须修改原有代码。
2022-12-09 21:13:27 537
原创 设计模式【21】——责任链模式(Chain of Responsibility 模式)
在我们请假的过程中,需要进行一些列的流程:先找部门负责人报备签字、再找部门领导签字,最后再找总经理签字。这个流程本质就是Chain of Responsibility 模式。本质上就是为请求创建了一个接收者对象的链,将对请求的发送者和接收者进行解耦,避免了请求发送者与接收者耦合。当有多个对象可以处理一个请求,哪个对象处理该请求运行时自动确定。而且客户也不清楚具体是那个对象处理请求,采用责任链模式最好。Chain of Responsibility 模式降低了耦合性。
2022-12-08 20:33:54 360
原创 设计模式【20】——访问者模式( Visitor模式)
在系统开发设计过程,经常会遇到需求变更的情况,经常我们做好的一个设计、实现了一个系统原型,咱们的客户又会有了新的需求。因此不得不去修改已有的设计,最常见就是解决方案就是给已经设计、实现好的类添加新的方法去实现客户新的需求,这样就陷入了设计变更的梦魇:不停地打补丁,其带来的后果就是设计根本就不可能封闭、编译永远都是整个系统代码。然而,Visitor 模式则提供了一种解决方案:将新需求实现封装到一个类中,并由待更改类提供一个接收接口,这样就可以实现接收新需求的添加。Visitor模式中,在 Visitor 模
2022-12-07 17:11:13 284
原创 设计模式【19】——命令模式(Command模式)
日常生活中,我们去饭馆吃饭一般都是找服务员点菜,而不是直接给厨师下菜单?其实,这种点菜的方式就是命令模式:我们点的菜单就是一个个请求,点菜员记录的菜单就是将请求生成的对象,点菜员不需要关心怎么做菜、谁来做,他只要把菜单传到后厨即可,由后厨统一调度。简而言之,命令模式就是把请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。Command 模式中,将请求的接收者(Reciever)放到 Command 的具体子类ConcreteCo
2022-12-07 13:34:01 518
原创 设计模式【18】——中介者模式( Mediator 模式)
在系统的设计开发过程中,对象之间的交互和通信是最常见的,因为对象间的交互本身就是一种通信。当系统规模变大,对象的大量增加会引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式。Mediator 模式提供将对象间的交互和通讯封装在一个类中,使各对象不需要显式地相互引用,实现了耦合松散,而且可以独立地改变它们之间的交互。Mediator模式中,每个Colleague维护一个 Mediator,当要进行交互,例如图中Co
2022-12-06 12:44:06 1040
原创 设计模式【17】——备忘录模式(Memento 模式)
备忘录模式用于保存和恢复对象的状态。备忘录模式在游戏中非常常见,比如在玩老头环进入新关卡时,我们通常会把游戏存档一下。即使在新关卡内死亡,我们也会在读档点复活,能读取当时保存的状态完整地恢复到当时的环境。我们在进行软件系统的设计时候是要给用户后悔的权利(实际上可能也是用户要求的权利:)),我们对一些关键性的操作肯定需要提供诸如回退的操作。那这个后悔药就是 Memento 模式提供的。Memento 模式的关键就是要在不破坏封装性的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作。M
2022-12-04 17:24:44 834
原创 设计模式【16】——观察者模式(Observer模式)
在现实世界中,许多对象是互相联系的。当其中一个对象的状态发生改变,可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时,其上游和下游产品也都会相应的变化;当我们开车通过交叉路口时,红灯j就要停,遇到绿灯会行。Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统
2022-12-03 12:52:55 338
原创 设计模式【15】——状态模式(State模式)
每个人、事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State)。最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正确你就可以 ok,否则就不让你通过。通常我们在实现这类系统会使用到很多的Switch/Case 语句,Case 某种状态,发生什么动作,Case 另外一种状态,则发生另外一种状态。但是这种实现方式也存在部分缺点:1)当状态数目不是很多的时候,Switch/Case 可能可以搞定。
2022-12-02 17:46:43 453
原创 设计模式【14】——策略模式( Strategy 模式)
Strategy 模式和 Template 模式要解决的问题是相同的,都是为了给业务逻辑具体实现和抽象接口之间的解耦。Strategy 模式将逻辑封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现。继承和组合之间的区别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象接口放在组合类中。继承:易于修改和扩展那些被复用的实现。
2022-12-01 17:09:56 237
原创 设计模式【13】——模板模式(Template 模式)
在系统的设计开发过程中经常会遇到:对于某一个业务逻辑的算法实对于不同的对象中有着不同的内部细节实现,但是整体的逻辑运行框架是相同的。Template 提供了这种情况的一个实现框架。Template 模式采用继承的方式实现,其将逻辑框架放在抽象基类中,并定义好具体接口,然后在子类中实现具体运算细节。Template 模式是很简单模式,也是应用很广的模式。具体而言,Template 采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。
2022-12-01 12:38:39 455
原创 设计模式【12】——代理模式(Proxy 模式)
在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。至少在以下集中情况下可以采用 Proxy 模式解决问题:1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理2)为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GoF 称之为远程代理。
2022-11-30 21:47:31 431
原创 设计模式【11】——外观模式( Facade 模式)
实际上在软件系统开发的过程中经常会遇到这样的情况:可能你实现了一些接口(或者不同的功能模块),而这些接口(模块)都分布在几个类中(比如 A 和 B、C、D):A 中实现了一些接口,B 中实现一些接口(或者 A 代表一个独立模块,B、C、D 代表另一些独立模块)。然后你的客户(并不清楚你的具体接口到底是在哪个类中实现的,而且他们绝大多数的需求只是简单的组合: A、B、C、D 四个接口的组合,而且并不关心这些结果的内部细节。因此,在设计开发中可以通过一个叫做 Façade 的模式来解决上面的问题。
2022-11-30 21:23:35 281
原创 设计模式【10】——享元模式( Flyweight 模式)
创建对象的过程在面向对象系统的设计中是最经常用到的设计方法。但是,如果在设计过程中创建了太多的对象,会造成存储空间的巨大开销或者浪费。特别是对于大量轻量级(细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为没有字母创建一个对象的话,系统可能会因为大量的对象而造成存储开销的浪费。例如一个字母“a”在文档中出现了100000 次,而实际上我们可以让这一万个字母“a”共享一个对象,当然因为在不同的位置可能字母“a”有不同的显示效果(例如字体和大小等设置不同),在这种情况我们可以为将对象的状态分为“
2022-11-29 21:16:10 364
原创 一篇看懂VINT编码
使用VINT编码后,对于不同的整数可以使用动态变化的字节来表示,特别是在小数占比较大的情况下,数据压缩效率十分明显。至此,VINT的相关知识介绍完毕。
2022-11-27 20:59:12 852
原创 设计模式【9】——组合模式(Composite 模式)
Composite(组合模式)是一种管理树形结构的抽象方式。其是将对象组合成树形结构,从而构成表示“部分 - 整体” 的层次结构。这种层次关系在日产生活中十分常见。如在公司组织关系中,可能分为部门与人,其中人属于部门,有的人有下属,有的人没有下属。假如将部门、人等都抽象成为一个节点(不用关心当前节点是部门还是人,两者有公共的基类),这样的话公司的组织架构就十分清晰,而且某个部门下有多少人、财务数据等这些数据也容易统计。除了公司外,在操作系统中也普遍应用,其中的文件夹与文件。
2022-11-27 17:49:48 404
原创 设计模式【8】——装饰器模式(Decorator 模式)
在系统程序设计与开发过程中,会经常遇到需要为一个已经定义好的类添加新的功能或者操作,通常的情况下我们可以定义一个新类继承自定义好的类。但是这样会带来一个问题:当具体子类要添加新的功能函数时,就必须向其父类添加一个相应的功能函数的抽象接口,否则无法通过父类指针实现调用功能。因此,处于高层的父类就承载了太多的抽象接口,而且所有继承自父类的子类都不可避免继承了这些接口,但是部分功能可能并不是该子类所需要的。另一方面,通过继承的方式解决的话还增加了系统的复杂性。
2022-11-26 16:39:54 444
原创 设计模式【7】——适配器模式(Adapter 模式)
实际上在软件系统设计和开发中,经常会遇到:我们为了完成某项工作购买了一个第三方的库来加快开发。这就带来了一个问题:我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter 模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。Adapter 模式正好可以解决这种问题,相当于对接口进行包装,起到一个适配器的作用。类模式和对象模式。这里我们主要介绍类模式。
2022-11-25 21:54:20 655
原创 设计模式【6】——桥接模式(Bridge 模式)
在开发过程中大家肯定都遇到过这样的问题:1)客户给了你一个需求,于是使用一个类来实现(A);2)客户需求变化,有两个算法实现功能,于是改变设计,我们通过一个抽象的基类,再定义两个具体类实现两个不同的算法(A1 和 A2);3)客户又告诉我们说对于不同的操作系统,于是再抽象一个层次,作为一个抽象基类A0,在分别为每个操作系统派生具体类(A00 和 A01,其中 A00 表示原来的类 A)实现不同操作系统上的客户需求,这样我们就有了一共 4 个类。
2022-11-23 21:10:52 1066
原创 设计模式【5】——原型模式( Prototype 模式)
Prototype 模式提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在 C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。Prototype 模式的结构和实现都很简单,其关键就是(C++中)拷贝构造函数的实现方式,这也是 C++实现技术层面上的事情。由于在示例代码中不涉及到深层拷贝。
2022-11-22 21:34:13 201
原创 设计模式【4】——建造者模式(Builder 模式)
生活中有着很多的Builder的例子,个人觉得大学生活就是一个Builder模式的最好体验:要完成大学教育,一般将大学教育过程分成 4 个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这 4 年的(4 个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同)。Builder 模式要解决的也正是这样的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合。
2022-11-21 22:32:07 149
原创 设计模式【3】——单例模式(Singleton 模式)
Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现。Singleton 模式的实现需要说明的是,Singleton 不可以被实例化,因此我们将其构造函数声明为 protected 或者直接声明为 private。
2022-11-20 20:18:18 614
原创 设计模式【2】——抽象工厂模式( AbstactFactory 模式)
假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心。理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。
2022-11-20 14:46:24 769
原创 设计模式【1】——工厂模式(Factory 模式)
在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们通常会抽象出类的公共接口以形成抽象基类或者接口。基于此,我们可以通过定义一个指向基类的指针来指向实际的子类实现,达到了多态的目的。但是,当有许多的子类继承自抽象基类,我们每次要用到子类式就需要重新定义子类,诸如 new ×××的代码。这样处理会带来两个问题 :1.客户程序员必须知道实际子类的名称(当系统复杂后,命名可能就出现了问题);2.程序的扩展性和维护变得越来越困难。
2022-11-20 11:52:27 682
从0开始实现目标检测-原理篇
2023-07-27
可视化SLAM算法详解,非常详细
2023-07-25
遗传算法遗传算法之路径规划matlab代码(栅格地图)含详细注释
2023-07-25
[二维装箱问题]二维装箱问题之BL法修正版附MATLAB代码
2023-07-24
【混合粒子群算法】混合粒子群算法求解TSP问题matlab代码
2023-07-24
【动态粒子群算法】基于动态粒子群算法的动态环境寻优算法 MATLAB代码
2023-07-24
蚂蚁算法基于蚁群算法的二维路径规划附matlab代码
2023-07-24
聚类算法聚类算法代码附MATLAB & python代码
2023-07-24
【量子遗传算法】量子遗传算法附matlab代码
2023-07-24
免疫算法基于免疫优化算法的物流配送中心选址问题附Matlab代码
2023-07-24
【模拟退火算法】模拟退火算法(SA)求解配送中心选址问题附MATLAB代码
2023-07-24
【RF时序预测】基于随机森林算法的时间序列预测附matlab代码
2023-07-24
RF分类基于随机森林算法的数据分类附matlab代码
2023-07-24
蚁群算法蚁群算法求解TSP问题附Python代码
2023-07-20
蚁群算法蚁群算法求解TSP问题附matlab代码
2023-07-20
RRT算法基于采样的运动规划算法-RRT求解机器人路径规划附Matlab代码
2023-07-20
【概率路图算法】概率路图法(PRM)路径规划算法附Matlab完整代码
2023-07-20
路径规划基于遗传算法实现机器人栅格地图路径规划附Matlab代码
2023-07-20
路径规划基于模糊逻辑算法实现机器人路径规划附Matlab代码
2023-07-20
【双向RRT算法】基于改进双向RRT*的移动机器人路径规划算法附Matlab源码
2023-07-20
A*算法机器人路径规划之A*算法附Matlab语言源码
2023-07-20
【人工势场法】机器人路径规划-人工势场法(Artificial Potential Field)附完整代码
2023-07-20
【K-means聚类】K-means聚类与DBSCAN原理及代码实现
2023-07-20
蚁群算法蚁群算法求解三维路径规划问题附MATLAB完整代码
2023-07-20
【BP神经网络】基于粒子群优化算法(PSO)的Bp神经网络预测21~22赛季NBA总冠军(附MATLAB代码)
2023-07-19
【分支定界算法】分支定界算法求解0-1背包问题附MATLAB完整加密代码
2023-07-19
【人工蜂群算法】人工蜂群算法附Python完整代码
2023-07-19
【混合K-Means蚁群算法】混合K-Means蚁群算法求解CVRP问题附Matlab完整代码
2023-07-19
GSK算法性能强悍的自适应GSK算法附Matlab完整代码
2023-07-19
【BP回归预测】基于BP神经网络的回归预测附matlab完整代码
2023-07-19
【RBF时序预测】基于径向基神经网络的时间序列预测附matlab完整代码
2023-07-19
【CNN时序预测】基于卷积神经网络的CNN时间序列预测matlab完整代码
2023-07-19
【LSTM时序预测】基于长短期记忆网络的时间序列预测附matlab完整代码
2023-07-19
蚁群算法求解三维路径规划问题(附MATLAB代码)
2023-03-20
文化算法(Cultural Algorithm,CA)
2023-03-20
模拟退火算法(SA)求解多配送中心选址问题
2023-03-20
Gaining‑sharing knowledge based algorithm(GSK)算法
2023-03-20
混合K-Means蚁群算法求解CVRP问题(附Matlab代码)
2023-03-20
人工蜂群算法MATLAB源码
2023-03-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人