首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏C++开发学习交流

    C++设计模式:工厂模式

    工厂模式 工厂模式属于创建者模式,提供了一种创建对象的最佳方式。 工厂模式的实现方式有简单工厂模式、工厂方法模式、抽象工厂模式,每个实现方式都存在优和劣。 简单工厂模式与工厂模式的结构组成是: 1. 工厂方法模式 简单工厂模式存在最大的问题是违背了“开闭原则”,每当增加新的产品时,需要修改工厂类的逻辑。为了规避这种不足,同时很好的利用简单工厂模式的优点,这里介绍工厂方法模式。 工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。 工厂方法是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。 3. 抽象工厂模式 汽车厂为了扩大业务,不只生产汽车了,还生产摩托车。抽象工厂模式可以创建多个工厂和多个产品族。 ; 产品结构稳定,设计完成之后不会向系统中新增或剔除某个产品。

    45810编辑于 2024-07-24
  • 来自专栏程序员的园——原创文章

    C++设计模式——策略模式

    在软件开发中,设计模式是提高代码可读性、可维护性和可扩展性的重要工具之一。其中,策略模式是一种行为型设计模式,它允许在运行时选择不同算法的行为,并支持不同策略的无缝切换。 概述 策略模式定义了一系列算法/场景,并使它们能够相互替换,从而使算法可以独立于其使用者而变化。在策略模式中,算法被封装成单独的类,使得它们可以在运行时切换。 代码示例 需求 假设有如下需求,某个酒店拥有自己的会员等级和会员制度,普通会员没有折扣;黄金会员享受9折优惠;钻石会员享受8折优惠;如何设计这套系统。 总结 策略模式是一种简单而灵活的设计模式,可以在运行时动态选择算法,从而提高代码的可扩展性和可维护性。 通过C++代码示例,我们了解了策略模式的基本结构和应用场景,并实现了一个简单的购物车系统来演示其用法。

    33310编辑于 2024-07-18
  • 来自专栏开源519

    C++设计模式 - 代理模式

    代理模式 ❝ 代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。 代理模式在Android中被用到很多。 代理模式主要是为客户端提供真实对象的使用入口,至于实现方式有多种,不必拘泥于某种特定的实现方法,达到代理模式的目的即可。 源码实现 「编程环境」 编译环境: Linux环境 语言: C++语言 编译命令: . 因此在引用设计模式时,并不需要完全按照其规定的方式来实现,理解其中的设计思想,结合自身情况,实现方式合理即可。 代理模式在安卓中被广泛运用到,例如binder。

    82800编辑于 2022-03-27
  • 来自专栏开源519

    C++设计模式 - 策略模式

    策略模式 策略模式定义多种处理同一种场景的不同算法,这些算法可在不影响用户的情况下互相替换。 场景 应用场景 某会员制商场有两种级别会员:银卡会员、黄金会员,分别享有9折、8折购物优惠。 解决方案 引入策略模式,将用户等级抽象,分别定义出用户所有的行为,不同等级的用户各自实现该等级应享有的权益。 类图 image.png CShop:商场类。实现不同等级顾客的折扣结算、生日礼物等。 theShop.GetCurrentDiscountRate(), theShop.GetRealPrice(cost)); return 0; } 总结 策略模式的实现原理比较简单 策略模式与命令模式有点相像。两者的实现方式类似,应对的场景不同。策略模式针对的是同一个行为不同的算法实现;命令模式针对是一个命令对应一个解决的方法。 全部源码可在公众号后台输入标题获取。

    51120编辑于 2022-01-18
  • 来自专栏破晓

    C++设计模式——代理模式

    其实在C++设计模式中,也有一种模式叫做——代理模式。 代理模式的定义 代理模式(Proxy Pattern)是一种结构型设计模式,在软件设计中,它为其他对象提供了一种代理或占位符,以控制对这个对象的访问。 代理模式的具体实现 具体要求有: 创建一个接口「抽象类」。 将抽象类的接口在真实类和代理类中具体实现。在代理类中,定义一个真实类的指针对象,实现多态。 以下是一个视频网站的代理模式

    37710编辑于 2024-10-12
  • 来自专栏开源519

    C++设计模式 - 代理模式

    代理模式 ❝代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。 代理模式在Android中被用到很多。 源码实现 「编程环境」 编译环境: Linux环境 语言: C++语言 编译命令: . 因此在引用设计模式时,并不需要完全按照其规定的方式来实现,理解其中的设计思想,结合自身情况,实现方式合理即可。 代理模式在安卓中被广泛运用到,例如binder。 更多文章内容包括但不限于C/C++、Linux、开发常用神器等,可进入“开源519公众号”聊天界面输入“文章目录” 或者 菜单栏选择“文章目录”查看。公众号后台聊天框输入本文标题,在线查看源码。

    36330编辑于 2022-12-01
  • 来自专栏开源519

    C++设计模式 - 状态模式

    状态模式 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 --百度百科 简单地说,状态模式就是状态机设计。 总结 状态模式的实现方法难度不大,主要是编程的思想的上升。将状态与需求绑定,不仅能够实现统一需求的不同响应方式,还能实现某些状态下不响应指定需求。场景清晰,思路明确。 状态模式的使用,可以使关注点仅放在当前状态遇到需求产生的完整流程。无需考虑其他状态的影响。 将需求与响应解耦,还能够实现通信管理。 例如,不同进程间的需求响应,可以将两者通信设计为不涉及业务的跨进程通信,从而实现通信代码的可复用。 总的来说,状态模式是一种非常实用的设计模式。 不仅是从代码上还有设计思路上,减轻设计师对复杂业务的整理工作。相同的完美!

    99100编辑于 2022-01-18
  • 来自专栏开源519

    C++设计模式 - 装饰模式

    装饰模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 --百度百科 装饰者模式主要是为一个对象增加新的行为,效果与子类扩展父类类似,但实现方式与继承不同,且更加灵活。 装饰模式类图 image.png Componet: 定义接口基类。 解决方案 引入装饰模式,在原有的日志的接口上封装一层修饰代码。这样就无需修改原先的日志代码,同时保证了新需求的开发。 / 输出至终端 fprintf(stdout, "%s", msg); // 添加新职能 return CCustomLog::WriteLog(tag, msg); } 总结 装饰模式的实现方法 装饰模式只是改变其外表的部分,原本的功能还是保留的。 在使用时,能够在不修改原有功能基础上,随意增加需要的功能。使用起来也比较灵活。 缺点在于,装饰模式对初始化要求较为严格,且代码难以理解。

    46430编辑于 2022-01-18
  • 来自专栏编译器开发

    C++设计模式--Visitor模式

    设计模式中,Visitor模式可以实现数据结构和数据操作的分离,主要适用以下场景: 数据结构稳定,但是针对数据的操作需求多样化; 在对数据进行操作过程中,不期望改变数据结构的组织方式。 在编译器设计中,源码经过词法分析、语法分析和语义分析后会生成抽象语法树(AST)。然后基于AST做一些分析转换,比如转换到IR结构或者进行一些优化。 这种场景非常适合使用Visitor模式来处理。 下文以cpp代码模拟一个简单文件系统中,Visitor模式遍历目录树的实现,方便对Visitor模式的理解。 Visitor模式中的双重分发(Double Distribution) 双重分发其实就是分别利用了c++中的多态和重载特性,分实现了对数据元素的遍历与访问。

    59920编辑于 2023-04-06
  • 来自专栏开源519

    C++设计模式 - 原型模式

    原型模式(Prototype) 原型模式是一种创建型设计模式,其功能为复制一个运行时的对象,包括对象各个成员当前的值。而代码又能保持独立性。 如果不加设计,这些代码可能散落在客户端函数。假如过了十年继续施展分身,又需重新增加这些代码。日积月累,这些终将成为晦涩而又难以维护的“一坨”。 实现 对于上述场景就有必要引入原型模式,原型模式设计也是比较简单的。只需要在类的设计时增加一个clone接口,用于返回当前对象this指针。 类图 原型模式 通过原型模式基类规范具备复制接口的子类实现。 总结 原型模式能够克隆一个对象,而类之间无需耦合。 客户代码在复制复杂的对象时,也更加方便。 此接口可重复使用,让代码逻辑更加清晰易懂。

    43130发布于 2021-11-18
  • 来自专栏开源519

    C++设计模式 - 享元模式

    -- 《水晶之恋》 享元模式 ❝享元模式是一种结构型设计模式, 它允许你在消耗少量内存的情况下支持大量对象。 如果此时设计一个对象池,里面缓存一定的对象,软件在用时申请,不用时回收。就能实现对象的重复利用,而多次创建和销毁对象。 应用场景 当前开发板仅存在3个Led灯,其中一个被用作Power指示灯,另两个可被用作软件调试或功能灯,设计Led资源管理,避免使用Led时发生冲突。 在《设计模式》中指出,「享元模式」可使用在类变量过多,反复创建/销毁会消耗资源的场景下。但是在笔者思考后发现,也可以用于对共享资源的管理上,于是有了本文。 在其他大佬总结中,很少看到代码中有回收动作。 更多文章内容包括但不限于C/C++、Linux、开发常用神器等,可进入“开源519”公众号聊天界面输入“文章目录”, 或菜单栏选择“文章目录”查看所有文章。后台聊天输入本文标题,可查看源码。

    43920编辑于 2022-12-01
  • 来自专栏C/C++进阶专栏

    C++设计模式——Proxy代理模式

    一,代理模式简介 代理模式是一种结构型设计模式,该模式通过引入一个新的代理对象Proxy,来间接访问原始对象,从而使访问方式变得灵活和可控。 代理对象的设定减少了客户端与真实对象之间的直接交互。 ; } }; int main() { Proxy p; p.request(); } 运行结果: RealSubject.request() 补充:在C+ +编码中,确实可以通过继承和虚函数实现父类调用子类的成员函数,这是C++多态特性的一种常见应用方式。 五,代理模式的优缺点 代理模式的优点: 可以在不修改被代理对象的情况下,增加额外的功能或控制访问方式。 可以在访问对象之前和之后进行一些处理,比如添加日志、添加时间戳等。 代理模式的缺点: 引入新的类,增加代码复杂性。 读取资源时,需要通过代理来间接访问,造成额外的性能损失。 六,代码实战 开发场景:基于Proxy模式来模拟对图片的延迟加载和显示控制。

    59010编辑于 2024-06-18
  • 来自专栏破晓

    C++设计模式——装饰器模式

    什么是装饰器模式? 装饰器模式(Decorator Pattern)是一种结构型设计模式,允许你向一个现有的对象添加新的功能,同时又不改变其结构。 这种模式通过创建一个装饰类,将对象放入装饰类中,然后动态地扩展对象的行为。 如何实现装饰器模式? 但虽然这些车属于不同的品牌,但是这些功能实现起来确很相似,但是如果我们分别添加不同的功能,就需要实现9个子类,所以我们可以利用装饰器模式来实现这个需求。

    29810编辑于 2024-10-12
  • 来自专栏C/C++进阶专栏

    C++设计模式——State状态模式

    一,状态模式的定义 状态模式是一种行为型设计模式,状态模式允许对象在内部状态发生切换时改变它自身的行为。 状态模式的主要目的是将复杂的状态切换逻辑抽象化为一组离散的状态类,使代码结构更加清晰和易于维护。 状态模式将对象的行为封装到不同的状态类中,从而在应用程序的状态发生改变时,会自动切换到对应的状态类。 状态模式使得状态的切换被表现为类对象的切换。 状态模式在现实生活中的抽象实例: 交通信号灯:交通信号灯有红灯、绿灯等多种状态。每个状态都定义了不同的行驶规则。 二,状态模式的结构 状态模式主要包含以下组件: 1.状态上下文(Context): 状态上下文是一个持有状态对象的类,它持有一个状态对象的引用,对外提供了切换状态的统一接口。 五,状态模式的优缺点 状态模式的优点: 修改灵活,当系统需求变化时,可以方便地添加、删除或修改状态,无需修改大量代码。 扩展性强,方便添加新的状态。

    49910编辑于 2024-07-25
  • 来自专栏C/C++进阶专栏

    C++设计模式——Strategy策略模式

    一,策略模式简介 策略模式是一种行为型设计模式,策略模式在软件开发场景中定义了一系列的算法,并将每个算法单独封装在可替换的对象中,使应用程序在运行时可以根据具体的上下文来动态地选择和切换算法,同时保持原有的代码架构不被修改 策略模式设计使得算法的实现与调用被分离,让算法可以独立于外部客户端进行开发和改动,使用独立的类来封装特定的算法,也避免了不同算法策略之间的互相影响。 二,策略模式的结构 策略模式主要包含以下组件: 1.策略上下文(Context): Context类是策略模式的调度核心,其内部包含了一个策略对象,并通过调用具体的策略对象来完成具体操作。 通用API开发:当同一个API需要提供多个版本或业务逻辑时,策略模式可以帮助隐藏具体细节。 五,策略模式的优缺点 策略模式的优点: 对“开闭原则”提供完美支持。 策略模式的缺点: 使类和对象的数量变得更多,增加了系统的复杂性。 如果策略被划分得过于细化,会导致过度设计,不易于代码理解。 代码涉及多个对象的创建和销毁,性能开销增大,大量使用会引起性能问题。

    34510编辑于 2024-07-01
  • 来自专栏C/C++进阶专栏

    C++设计模式——Command命令模式

    一,命令模式的定义 命令模式是一种行为型设计模式。在实际开发场景中,命令模式将一个请求的处理或者一个具体操作封装为一个对象,从而可以让开发者根据不同的请求参数来生成不同的执行函数。 命令模式的本质是对具体命令的拆解和封装,实现命令发送者和命令接收者的解耦。 命令模式使得具体的命令可以被存储和传递,由命令接收者来指定这个命令何时被执行、撤销等。 命令模式中的发送者只需要关注命令的发送即可,不需要关注具体命令的执行流程。 二,命令模式的结构 命令模式主要包含以下组件: 1.抽象命令接口(Command): 定义了命令的执行方法,内部包含一个execute()函数,用于定义命令的请求过程。 五,命令模式的优缺点 命令模式的优点: 命令模式将发送者和接收者解耦,使得两者可以分别独立变化。 扩展性好,新的命令可以很容易地添加和维护,不影响现有系统。

    48010编辑于 2024-07-01
  • 来自专栏开源519

    C++设计模式 - 单例模式

    单例模式(Singleton) 介绍 单例模式是创建型设计模式,即用于创建对象的设计。其能够保证当前系统仅存在一个实例,并提供获取该实例的接口供客户端使用。 当强行new操作时,编译报错) 单例模式的实现较为简单,部分专家并不认为其是一种设计,而是一种编程技巧。 意义 既然存在单例模式,那么其存在的意义是什么呢?又或者说能解决什么问题? 若设计对共享资源进行管理的单例类,所有的任务都只能通过单例类来访问共享资源。就可以实现此种需求。 实现 在上述介绍中,已经大致描述了单例的特点: 创建唯一的实例 。 类图 单例模式 代码 #include <iostream> #include <unistd.h> #include <thread> using namespace std; class CSingleton 总结 单例模式目前使用的较为流行,其实现方法也比较简单。当遇到需要管理公共资源时,可以采用单例模式

    65630发布于 2021-11-30
  • 来自专栏开源519

    C++设计模式 - 责任链模式

    责任链模式 ❝责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。 意义 责任链模式是一个很贴近生活的设计模式,使每个对象做好自己分内的事情即可。当一个请求来的时候,当前处理对象不能处理,那就交给下一个处理对象,至于是谁处理无需关心。 源码实现 「编程环境」 编译环境: Linux环境 语言: C++语言 编译命令: make 「工程结构」 ChainOfResponsibility/ ├── app_view.cc ├── app_view.h 其实现方式可根据不同的需求有不同的设计,关键在于其模式思想。 「优点」 降低了对象之间的耦合度。 更多文章内容包括但不限于C/C++、Linux、开发常用神器等,可进入“开源519公众号”聊天界面输入“文章目录” 或者 菜单栏选择“文章目录”查看。公众号后台聊天框输入本文标题,在线查看源码。

    48810编辑于 2022-12-01
  • 来自专栏开源519

    C++设计模式 - 模板方法模式

    模板方法 ❝模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 ❞ 模板方法模式利用C++多态特征,在父类定义一套结构流程,其中通用部分在父类实现,子类继承父类实现差异性的接口。 意义 模板方法模式是比较实用的一种设计模式,将不变部分的流程和接口在父类实现,变化部分的接口预留出来交由子类实现。如此,有利于代码的复用性、可扩展性。 应用场景 一位头痛和一位胃疼的病人去医院看病。 假如10个、20个不同症状的病人,按照这种设计,代码工作量大不说还会存在大量的重复逻辑代码。遇到这种重复代码,就要想办法抽象。 先抽象出看病流程,所有病人去医院看病的流程都是一致的。 更多文章内容包括但不限于C/C++、Linux、开发常用神器等,可进入“开源519公众号”聊天界面输入“文章目录” 或者 菜单栏选择“文章目录”查看。公众号后台聊天框输入本文标题,在线查看源码。

    55330编辑于 2022-12-01
  • 来自专栏C/C++进阶专栏

    C++设计模式——Facade外观模式

    一,外观模式简介 外观模式是一种结构型设计模式, 又称为门面模式,也是一种基于创建对象来实现的模式,为子系统中的各组接口的使用提供了统一的访问入口。 系统集成:当多个组件或服务接口需要被统一管理和使用时,借助外观模式构建一个统一的入口。 API升级:当API升级时,为了兼容旧版本的API接口的使用,创建一个外观模式的对象,既可以对外提供新的API接口,又向后兼容旧的API接口。 组件整合:为了让项目中兼容不同架构和使用方式的组件时,使用外观模式来规范化组件的调用方式。 四,外观模式的优缺点 外观模式的优点: 1.减少了需要客户端关注和处理的对象数,简化了接口的使用方式。 外观模式的缺点: 1.对底层的过度包装会增加性能开销。 2.如果设计的不合理,会使重构变得有难度。 3.如果存在访问共享资源的情况,代码的编写不够严谨时,相同层次的子系统和子系统之间可能会互相影响。

    50010编辑于 2024-06-18
领券