自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(48)
  • 收藏
  • 关注

原创 《设计模式的艺术》笔记 - 访问者模式

1. 增加新的访问操作很方便。使用访问者模式,增加新的访问操作就意味着增加一个新的具体访问者类,实现简单,无须修改源代码,符合开闭原则。2. 将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个的元素类中。类的职责更加清晰,有利于对象结构中元素对象的复用,相同的对象结构可以供多个不同的访问者访问。3. 让用户能够在不修改现有元素类层次结构的情况下,定义作用于该层次结构的操作。

2024-01-29 17:43:12 596

原创 《设计模式的艺术》笔记 - 模板方法模式

1. 模板方法模式在父类中形式化地定义一个算法,而由它的子类来实现细节的处理。在子类实现详细的处理算法时并不会改变算法中步骤的执行次序。2. 模板方法模式是一种代码复用技术,它在类库设计中尤为重要。它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为。它鼓励恰当使用继承来实现代码复用。3. 模板方法模式可实现一种反向控制结构。通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行。

2024-01-29 16:52:14 597

原创 《设计模式的艺术》笔记 - 策略模式

1. 策略模式提供了对开闭原则的完美支持。用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。2. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族,恰当使用继承可以把公共的代码移到抽象策略类中,从而避免重复代码。3. 策略模式提供了一种可以替换继承关系的办法。如果不使用策略模式,那么使用算法的环境类就可能会有一些子类,每一个子类提供一种不同的算法。但是,这样一来算法的使用就和算法本身混在一起,不符合单一职责原则。

2024-01-24 17:09:24 824

原创 《设计模式的艺术》笔记 - 状态模式

1. 封装了状态的转换规则。在状态模式中可以将状态的转换代码封装在环境类或者具体状态类中,对状态转换代码进行集中管理,而不是分散在一个个业务方法中。2. 将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境对象拥有不同的行为。3. 允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块。状态模式可以避免使用庞大的条件语句来将业务方法和状态转换代码交织在一起。4. 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

2024-01-24 14:51:11 965

原创 《设计模式的艺术》笔记 - 观察者模式

1. 观察者模式可以实现表示层和数据逻辑层的分离。它定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。2. 观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。3. 观察者模式支持广播通信。观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。

2024-01-24 11:51:42 733

原创 《设计模式的艺术》笔记 - 备忘录模式

1. 它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。2. 备忘录实现了对信息的封装。一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作。

2024-01-23 17:51:24 720

原创 《设计模式的艺术》笔记 - 中介者模式

1. 中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互。一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星形结构。2. 中介者模式可将各同事对象解耦。中介者有利于各同事之间的松耦合,可以独立地改变和复用每一个同事和中介者,增加新的中介者和新的同事类都比较方便,更好地符合开闭原则。3. 可以减少大量同事子类生成。

2024-01-23 16:58:30 707

原创 《设计模式的艺术》笔记 - 迭代器模式

1. 支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法,也可以自己定义迭代器的子类以支持新的遍历方式。2. 迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计。3. 在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,满足开闭原则的要求。

2024-01-23 14:16:20 580

原创 《设计模式的艺术》笔记 - 解释器模式

1. 易于改变和扩展文法。由于在解释器模式中使用类来表示语言的文法规则,因此可以通过继承等机制来改变或扩展文法。2. 每一条文法规则都可以表示为一个类,因此可以方便地实现一个简单的语言。3. 实现文法较为容易。在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂,还可以通过一些工具自动生成节点类代码。4. 增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类,原有表达式类代码无须修改,符合开闭原则。

2024-01-22 16:42:17 678

原创 《设计模式的艺术》笔记 - 命令模式

1. 降低系统的耦合度。由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间实现完全解耦,相同的请求者可以对应不同的接收者。同样,相同的接收者也可以供不同的请求者使用,两者之间具有良好的独立性。2. 新的命令可以很容易地加入系统中。由于增加新的具体命令类不会影响到其他类,因此增加新的具体命令类很容易,无须修改原有系统源代码甚至客户类代码,满足开闭原则的要求。3. 可以比较容易地设计一个命令队列或宏命令(组合命令)。4. 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案。

2024-01-19 15:20:38 869

原创 《设计模式的艺术》笔记 - 职责链模式

1. 职责链模式使得一个对象无须知道是其他哪一个对象处理其请求。对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构。由客户端负责链的创建,降低了系统的耦合度。2. 请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接。3. 在给对象分派职责时,职责链可以提供更多的灵活性,可以通过在运行时对链进行动态的增加或修改来增加或改变处理一个请求的职责。

2024-01-19 11:52:08 624

原创 《设计模式的艺术》笔记 - 代理模式

1. 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度,满足迪米特法则。2. 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。3. 远程代理为位于两个不同地址空间对象的访问提供了一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。4. 虚拟代理通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。

2024-01-18 18:14:27 780

原创 《设计模式的艺术》笔记 - 享元模式

1. 可以极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份,从而可以节约系统资源,提高系统性能。2. 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。

2024-01-18 17:13:25 712

原创 《设计模式的艺术》笔记 - 外观模式

1. 对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。2. 实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。3. 一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。4. 只是提供了一个访问子系统的统一入口,并不影响客户端直接使用子系统类。

2024-01-18 16:24:01 850

原创 《设计模式的艺术》笔记 - 装饰模式

1. 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加。2. 可以通过一种动态的方式来扩展一个对象的功能。通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为。3. 可以对一个对象进行多次装饰。通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合,得到功能更为强大的对象。4. 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合开闭原则。

2024-01-18 15:26:45 639

原创 《设计模式的艺术》笔记 - 组合模式

1. 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次。它让客户端忽略了层次的差异,方便对整个层次结构进行控制。2. 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。3. 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则。4. 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案。通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

2024-01-18 12:04:37 723

原创 《设计模式的艺术》笔记 - 桥接模式

1. 分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化(即抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任意组合子类,从而获得多维度组合对象)2. 在很多情况下,桥接模式可以取代多层继承方案。多层继承方案违背了单一职责原则,复用性较差,且类的个数非常多。桥接模式是比多层继承方案更好的解决方法,它极大地减少了子类的个数。3. 桥接模式提高了系统的可扩展性。

2024-01-17 18:27:18 610

原创 《设计模式的艺术》笔记 - 适配器模式

1. 将目标类和适配者类解耦。通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。2. 增加了类的透明性和复用性。将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者类的复用性,同一个适配者类可以在多个不同的系统中复用。3. 灵活性和扩展性都非常好。通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合开闭原则。

2024-01-17 17:15:00 674

原创 《设计模式的艺术》笔记 - 建造者模式

1. 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。2. 每个具体建造者都相对独立,而与其他具体建造者无关。因此,可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合开闭原则。3. 可以更加精细地控制产品的创建过程。

2024-01-16 18:04:44 638

原创 《设计模式的艺术》笔记 - 原型模式

1. 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。2. 扩展性较好。由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中,增加或减少具体原型类对原有系统都没有任何影响。3. 原型模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式就不需要这样。原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品。

2024-01-15 17:24:31 622

原创 《设计模式的艺术》笔记 - 抽象工厂模式

1. 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了在抽象工厂中声明的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。3. 增加新的产品族很方便,无须修改已有系统,符合开闭原则。

2024-01-15 14:51:33 604

原创 《设计模式的艺术》笔记 - 工厂方法模式

优点:1. 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节。用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。2. 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,正是因为所有的具体工厂类都具有同一抽象父类。

2024-01-12 17:15:03 575

原创 《设计模式的艺术》笔记 - 简单工厂模式

优点:1. 工厂类包含必要的判断逻辑,可以决定什么时候创建哪一个产品类的实例。2. 客户端无须知道所创建的具体产品类的类名,只需要知道对应的参数即可。3. 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。缺点:1. 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。2. 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。3. 系统扩展困难。

2024-01-12 15:09:41 568

原创 《设计模式的艺术》笔记 - 单例模式

单例模式优点是可以确保系统中只存在单个对象实例,缺点是不便扩展,一定程度上违背单一原则,既提供业务方法,又提供创建对象方法。

2024-01-12 11:46:30 560

原创 《设计模式的艺术》笔记 - 面向对象设计原则

抽象不应该依赖于细节,细节应该依赖于抽象。即要针对接口编程,而不是针对实现编程。在程序代码中传递参数时或关联关系时,尽量引用层次高的抽象层类(基类)。所有引用基类的地方必须能透明地使用其子类的对象。即在软件中将一个基类对象替换成其子类对象,程序不会产生任何错误和异常。一个软件实体应当对扩展开放,对修改关闭。即软件实体应当尽量在不修改原有代码的情况下进行扩展。使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。尽量使用对象组合,而不是继承来达到复用的目的。

2024-01-12 10:36:41 540

原创 jpeg渐进式解码

jpeg图片有两种压缩形式,一种标准形式(baseline),另一种是渐进式(progressive),前面有解析过标准形式的解压过程(https://mp.csdn.net/mp_blog/creation/editor/104698595),这里补充一下渐进式的解压过程。 渐进式图片是分多次分别压缩不同分量(Y/Cb/Cr)的不同部分,目前我看到的一般都是按7轮和10轮进行压缩的 下面是一张经过10轮压缩的图片的压缩过程:comp Ss ...

2021-07-13 10:51:00 928

原创 snappy算法解析

1. 获取原始数据大小N,将N存储到输出结果开头位置,占用1-5个字节不等:N < (1 << 7)时,占1个字节 out[0] = N N < (1 << 14)时,占2个字节 out[0] = N | 128; out[1] = N >> 7; N < (1 << 21)时,占3个字节 out[0] = N | 128; out[1] = (N >> 7) | 128; out[2]

2021-07-12 18:13:06 978

原创 jpg图片解码详细过程

图片数据解码过程1.开始标记FF D8 FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 00 01 00 00这部分是图片的开始,包含SOI,start of image(FF D8),JFIF,版本号之类的,这部分对后面解压没什么作用,这里不做介绍2.量化表地址:0x00000014数据:FF ...

2020-03-06 16:25:54 7960

原创 linux程序从终端获取输入不能使用左右移动键

linux下开发程序经常会设计从终端获取一行命令,然后根据命令执行对应的操作,但是输入命令的时候一旦漏写字符,只能删除到漏写的地方,然后重新输入,非常不方便。自己处理各种按键比较麻烦,后来发现一个工具rlwrap可以解决这个问题,使用非常方便:1、首先安装yum install rlwrap2、然后就可以直接使用,rlwrap命令后跟自己的程序,把rlwrap当做一个...

2019-09-17 11:13:44 883

转载 支持向量机通俗导论(理解SVM的三层境界)

&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 支持向量机通俗导论(理解SVM的三层境界)作者:July 。致谢:pluskid、白石、JerryLead。说明:本文最初写于2012年6月,而后不断反反复复修改&amp;amp;amp;优化,修改次数达上百次,最后修改于2016年...

2019-03-14 19:57:40 852

原创 字符串排列与组合

一、字符串的排列给定一个字符串,如何求出字符串的所有排列。解题思路:字符串的排列可以拆分成,第一个字符和后面的字符进行组合而成,只需要变换第一个字符,然后递归求后面的字符的排列即可,等到后面的字符为空的时候就得到一种字符的排列,下面是代码实现:// str 要排列的字符串// pBegin 待排列的字符串的起始位置,递归用void Permutation(char *str, c...

2019-01-05 21:16:51 319

原创 redis源码分析—字符串(sds)处理

redis中对字符串进行了一些特殊的处理,在每个字符串前面增加了一个头结构,头结构保存了字符串的长度、内存大小和类型,redis根据字符串长短定义了5种字符串头结构类型:sdshdr5(没使用)、sdshdr8、sdshdr16、sdshdr32、sdshdr64len表示字符串长度alloc表示除头部和结束标志后内存大小flags表示字符串头部的类型(SDS_TYPE_8等)bu...

2018-12-02 13:59:46 475

原创 sql server查询器访问其它实例中表数据

工作中经常需要从其他数据库实例中拷贝数据到当前实例,或者关联不同的实例的表中数据,可以通过下面方法在一个查询器中同时访问多个数据库实例use mastergoexec sp_configure 'allow updates', 0reconfigureexec sp_configure 'show advanced options',1reconfigureexe...

2018-11-07 17:34:37 510

原创 redis源码分析—AE事件处理机制

redis中有两类事件,一类是IO事件统一封装成aeFileEvent,底层调用系统支持的多路复用层(evport、epoll、kqueue、select),一类是定时器事件,以aeTimeEvent描述,巧妙借用系统函数epoll_wait等阻塞函数设置阻塞时间以达到触发条件/* Include the best multiplexing layer supported by this s...

2018-11-07 17:19:12 1280

原创 redis源码分析—IO模型封装

        redis采用的是事件驱动机制,内部封装了sunos的evport、linux下的epoll、kqueue和select,通过宏定义判定使用哪个模型。主要看了下epoll的代码,redis在每个模型中分别定义了一个aeApiState结构体,用于记录需要用到的数据,epoll中如下:typedef struct aeApiState { int epfd; s...

2018-11-06 13:53:52 459

原创 堆排序

void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void ajustHeap(int a[], int start, int len) //根节点值变动后调整成新的大根堆{ int dad = start, son = 2 * dad + 1; while (son &lt; len) { if...

2018-10-30 16:55:55 104

原创 hadoop3.1.1上开发c++程序

工作之余抽时间研究了下hadoop,前前后后搞了好几天,终于完成第一个c++程序的运行,其中碰到很多问题,在此记录下来:一、搭建hadoop环境1、基本环境     vmware workstation:没那么多物理机器,用虚拟机代替,主机内存8G,建立三个虚拟机,每个虚拟机分配1G内存     centos 7:hadoop运行操作系统,64位 2、创建虚拟机    ...

2018-08-22 22:25:54 640

原创 RCF的使用

RCF是一个C++开发的RPC框架。下面把RCF的编译和简单使用过程做一个记录,使用的是RCF3.0,操作系统是Centos7.0(64位):1、下载RCF源码进入RCF官网,下载文件RCF-3.0.251.tar.gz2、解压安装包[root@localhost root]# tar -zvcf RCF-3.0.251.tar.gz[root@localhost root]#...

2018-08-03 14:52:14 5247

原创 epoll使用

服务端:#include &lt;stdio.h&gt;#include &lt;sys/epoll.h&gt;#include &lt;queue&gt;#include &lt;iostream&gt;#include &lt;semaphore.h&gt;#include &lt;pthread.h&gt;#include &lt;sys/socket.h&gt;#inc

2018-08-01 09:23:59 164

原创 c++builder codeguard使用方法

       最近程序总是出现各种非法访问错误,想找这种错误又比较麻烦,之前有看到网上介绍BCB自带的codeguard工具,据说挺好用的,就研究了一下,只是测试了个很简单的例子,感觉还挺好的,下面是测试过程:       创建一个程序:#include &lt;vcl.h&gt;#pragma hdrstop#include "Unit1.h"//--------------------...

2018-07-11 17:25:35 2594

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除