C++设计模式
文章平均质量分 96
本栏目详细介绍了C++设计模式相关内容,对于理解学习十分有用,适合初学者学习,一定经验者回顾
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
十月旧城
winter is coming
展开
-
C++设计模式_26_设计模式总结
本篇为C++设计模式的总结课,此篇再回到原帮助大家梳理一下。原创 2023-11-02 15:06:52 · 428 阅读 · 0 评论 -
C++设计模式_25_Interpreter 解析器
给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子----《设计模式》GoF我们刚才定义文法的表示,用所谓+、-的从左到右的规则Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的结构不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。上面代码加减表达式会不断变化;假如将大写的数字"string s = 肆仟叁佰伍拾陆"转换为数,这种问题也可以使用解析器模式。原创 2023-11-02 10:58:03 · 240 阅读 · 0 评论 -
C++设计模式_24_Visitor 访问器
表示一个作用于某对象结构(Element)中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。----《设计模式》GoF和都是新的操作,每一次添加一次新操作都是扩展,这就是开闭原则的体现–利用子类的方式实现新的操作。#4. 结构(Structure)上图是《设计模式》GoF中定义的Visitor 访问器的设计结构。结合上面的代码看图中最重要的是看其中稳定和变化部分,也就是下图中红框和蓝框框选的部分。原创 2023-11-01 15:23:40 · 718 阅读 · 0 评论 -
C++设计模式_23_Command 命令模式
将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。----《设计模式》GoFCommand模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。通过使用Composite模式,可以将多个命封装为一个“复合命令”MacroCommand。原创 2023-11-01 11:04:00 · 442 阅读 · 0 评论 -
C++设计模式_22_Chain of Resposibility 职责链(理解,已过时)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链(单向链表),并沿着这条链传递请求,直到有一个对象处理它为止。----《设计模式》GoFChain of Responsibility 模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”这时候请求发送者与接受煮的耦合有可能出现”变化脆弱”的症状,职责链的目的就是将二者解耦,从而好地应对变化。原创 2023-10-31 16:17:42 · 217 阅读 · 0 评论 -
C++设计模式_21_Iterator 迭代器(理解;面向对象的迭代器已过时;C++中使用泛型编程的方式实现)
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。----《设计模式》GoFGoF中最早提出面向对象对象的方式实现迭代器,但是在讲面向对象的方式之前,需要重点说一下,这种方式在C++今天来讲已经过时了,因为学过STL泛型编程的都知道泛型编程中存在迭代器,思想与今天所讲的是一样的,都是通过一种接口的方式来隔离算法和容器之间的变化,但是GoF当初定义是面向对象的方式来定义的。迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。原创 2023-10-31 14:15:07 · 192 阅读 · 0 评论 -
C++设计模式_20_Composite 组合模式
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。----《设计模式》GoF这里的一致性指下面的代码在使用时,不论是树节点还是叶子结点,使用方法都是一致的。Composite模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化为“一对一”的关系,使得客户代码可以一致地(复用)处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。如果不使用那个核心代码//多态调用,就需要在。原创 2023-10-30 16:05:07 · 273 阅读 · 0 评论 -
C++设计模式_19_Memento 备忘录(理解,目前多使用序列化方案来实现)
在不破坏(Originator)封装性的前提下,捕获一个对象的内部状态(Memento mem = orginator.createMomento()😉,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。----《设计模式》GoF备忘录(Memento)存储原发器(Originator)对象的内部状态,在需要时恢复原发器状态。Memento模式的核心是信息隐藏,即Originator需要向外界隐藏信息,保持其封装性。但同时又需要将状态保持到外界(Memento)原创 2023-10-30 14:36:03 · 162 阅读 · 0 评论 -
C++设计模式_18_State 状态模式
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。----《设计模式》GoFState模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换是原子性的–即要么彻底转换过莱,要么不转换。原创 2023-10-30 11:25:14 · 553 阅读 · 0 评论 -
C++设计模式_17_Mediator 中介者
用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖运行时依赖),从而使其耦合松散 (管理变化),而且可以独立地改变它们之间的交互。—《设计模式》GoF最经典的依赖倒置原则,A本来依赖B,转换为A依赖IB,B依赖IA,难道A从此和B没关系了吗?不是的,你会发现运行时A和B还产生依赖关系,只不过依赖关系从编译时转换到了运行时。原创 2023-10-28 22:15:04 · 356 阅读 · 0 评论 -
C++设计模式_16_Adapter 适配器
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。----《设计模式》GoFAdapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。GoF23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。原创 2023-10-28 17:42:21 · 219 阅读 · 0 评论 -
C++设计模式_15_Proxy 代理模式
为其他对象提供一种代理以控制(隔离,使用接口) 对这个对象的访问。—《设计模式》GoF“增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy。原创 2023-10-28 10:20:07 · 355 阅读 · 0 评论 -
C++设计模式_14_Facade门面模式
为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。----《设计模式》 GoF从客户程序的角度来看,Facade模式简化了整个组件系统的接口,对于组件内部与外部客户程序来说,达到了一种“解耦”的效果一一内部子系统的任何变化不会影响到Facade接口的变化。Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。原创 2023-10-26 16:28:17 · 347 阅读 · 0 评论 -
C++设计模式_13_Flyweight享元模式
运用共享技术有效地支持大量细粒度的对象。–《设计模式》GoF比如说字符串,字符串在系统中使用的量是非常大的,占用的内存也是比较大的,常见的系统包括stl等都用了一定的共享技术,java和C#会在编译器层面用一些共享技术。除了字符串,线程也是一类例子。面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触发面向对象的抽象性问题。原创 2023-10-25 16:18:58 · 360 阅读 · 0 评论 -
C++设计模式_12_Singleton 单件模式
总体来说,如果是单线程使用版本1已经是足够好了;如果是多线程,使用版本2是OK的,但是效率不高;双检查锁在不使用volatile不能用,是很容易出现问题的;C++11版本之后跨平台实现双检查锁就使用的是最后一个版本保证一个类仅有一个实例,并提供一个该实例的全局访问点–《设计模式》GoFSingleton模式中的实例构造器可以设置为protected以允许子类派生Singleton模式一般不要支持拷贝构造函数和Clone接口,因为这有可能导致多个对象实例,与Singleton模式的初衷违背。原创 2023-10-24 15:39:22 · 260 阅读 · 0 评论 -
C++设计模式_11_builder 构建器(小模式,不太常用)
两种形式均是属于builder构建器模式;根据类的复杂程度决定使用形式1或者形式2,简单的情况下使用形式1,复杂的情况下使用形式2将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。——《设计模式》GoF如果只是做到最初的版本已经够了,最后复杂的版本是考虑将一个复杂对象的构建与其表示相分离,House是表示,HouseBuilder是构建。i < 4;原创 2023-10-23 15:07:49 · 287 阅读 · 0 评论 -
C++设计模式_10_ Prototype 原型模式(小模式,不太常用)
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。——《设计模式》GoF“原型实例”就是在MainForm中的,这里的“拷贝”是深克隆。Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”Prototype模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象一-所需工作仅仅是注册一个新类的对象 (即原型),然后在任何需要的地方Clone。原创 2023-10-20 15:22:01 · 526 阅读 · 0 评论 -
C++设计模式_09_Abstract Factory 抽象工厂
/数据库访问有关的基类public://支持SQL Serverpublic://支持Oraclepublic://关联性//关联性因为这3个factory特别有相关性,那用1个factory就可以了,将这3个类放在一起,实现高内聚松耦合。大家看到这里就发现使用一个工厂,这就保证了关联性,解决了上面提到问题。从上面的代码可以看出Abstract Factory 其实被称为。原创 2023-10-20 13:26:22 · 234 阅读 · 0 评论 -
C++设计模式_08_Factory Method工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。 ——《设计模式》GoF//工厂基类public://具体工厂public:......Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。原创 2023-10-19 13:59:52 · 457 阅读 · 0 评论 -
C++设计模式_07_Bridge 桥模式
将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。 ——《设计模式》GoFBridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。原创 2023-10-08 15:52:20 · 233 阅读 · 0 评论 -
C++设计模式_06_Decorator 装饰模式
动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)。——《设计模式》GoF通过采用组合而非继承的手法, Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。Decorator类在接口上表现为is-aComponent的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a。原创 2023-09-24 19:07:17 · 345 阅读 · 0 评论 -
C++设计模式_05_Observer 观察者模式
定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。——《设计模式》 GoF使用面向对象的抽象, Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。代码中随便添加观察者,但是addIProgress,removeIProgress,onProgress保持复用性不变目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。//发送通知。原创 2023-09-12 22:43:59 · 576 阅读 · 0 评论 -
C++设计模式_04_Strategy 策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。--《设计模式》 GoF什么是互相替换,就是支持变化。上面程序中SalesOrder独立于税法的变化,SalesOrder是稳定的。Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。运行时传递多态的对象,//多态调用运行时支持多态的调用Strategy模式提供了用条件判断语句。原创 2023-09-11 22:18:52 · 627 阅读 · 0 评论 -
C++设计模式_03_模板方法Template Method
定义一个操作中的算法的骨架(对应第二种方法的run函数) (稳定),而将一些步骤延迟(延迟一般代表定义一个虚函数,让子类去实现虚函数,也就是支持子类来变化)(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构,即可重定义(override 重写)该算法的某些特定步骤。—《设计模式》GoF可以参考方法二中的代码进行映射理解的。原创 2023-09-08 22:11:31 · 951 阅读 · 0 评论 -
C++设计模式_02_面向对象设计原则
首先举一个现实生活的例子,有一个需求,需要做一套桌椅板凳,将需求提交给一个木器加工厂,加工过程中,使用场景是在一个办公大楼,所有的办公家具需要达到一个几级阻燃的标准,现在将新的需求告诉加工厂,木器加工厂如何应对呢?有的时候,你会发现一个类会写的很臃肿,当一个类中放了太多的功能,也就隐含了多个责任,当隐含多个责任的时候就会出毛病,多个责任将你往不同的方向拉扯,用子类的时候,一会这个方向,一会那个方向。,这是因为抽象应该是稳定的,如果依赖于一个实现细节,这个实现细节是容易变化的,就会变成,稳定的依赖于变化。原创 2023-08-29 22:11:19 · 985 阅读 · 0 评论 -
C++设计模式_01_设计模式简介(多态带来的便利;软件设计的目标:复用)
理解松耦合设计思想掌握面向对象设计原则掌握重构技法改善设计掌握GOF 核心设计模式软件领域的设计模式是参考一个建筑学家提出的进行定义的。“每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动” -Christopher Alexander也就是不用再重新开发轮子。原创 2023-08-27 17:47:56 · 1144 阅读 · 0 评论