2024年C++常用的11种设计模式_c++设计模式(2),2024年最新一次关于C C++的面试经历

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

适配器模式

定义:适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。例如,读卡器是作为内存卡和笔记本之间的适配器。将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

其中适配器模式又分为类适配器和对象适配器
*
类适配器采用多继承实现,并提供适配后的接口;对象适配器是将需要适配的对象进行包装然后提供给适配后的接口。
*
适用场景:有动机的修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
*
实例:1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。
*
优点:1、可以让任何两个没有关联的类一起运行 2、提高了类的复用 3、增加了类的透明度 4、灵活性好
*
缺点:过多的使用适配器,会让系统显得很凌乱,不易整体把握。

外观模式

定义:提供了一个统一的接口,用来访问子系统的一群接口。向现有的系统添加一个接口,用来隐藏系统的复杂性。
作用:简化类的接口,让一系列的复杂过程封装到内部,对外只提供最简单的接口。
适用场景:1、客户端不需要知道系统内部的复杂联系,,整个系统只需要提供一个“接待员”即可。2、定义系统的入口。3、为复杂的模块或子系统提供外界访问的模块。4、子系统相对独立。
实例:1、自己做大餐(很烦很复杂,过程多)VS到餐厅做大餐(接待员一键式安排,自己等着就好)2、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
优点:1、减少系统的相互依赖,所有的依赖都是对外观类的依赖,与子系统无关。2、对用户隐藏了子系统的具体实现,减少用户对子系统的耦合,这样就算具体的子系统发生了改变,用户也不会知道。3、提高安全性。
缺点:不符合开闭原则,如何业务变更,则需要修改外观类,继承重写都不合适。

代理模式

定义:为其它对象提供一种代理,以控制对这个对象的访问。用户操作代理,代理操作具体的类。
*
作用:所谓代理模式就是在用户和具体类之间加一个代理类,起到一个中介的作用。
*
适用场景:1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
*
实例:1、Windows里面快捷方式。2、猪八戒去找高翠兰,结果高翠兰是孙悟空变得,这个孙悟空就是高翠兰的代理类,把高翠兰的外貌抽象出来,孙悟空和高翠兰都实现了这个接口,而猪八戒看不出来高翠兰其实是孙悟空变得。3、火车票不一定是在火车站买,也可以在代售点或者各种app上买。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。5、卖书(书店和淘宝作为代理商,用户通过代理商买书)。 6、智能指针。7、Java里面的spring aop。
*
优点:1、代理模式能将代理对象与真实对象被调用的目标对象分离,降低了系统的耦合度,扩展性好,保护目标对象,增强目标对象
*
缺点:1、代理模式会造成系统设计中类的数目增加,增加了系统的复杂度,2、在客户端和目标对象之间增加一个代理对象会造成请求处理速度变慢。
*

包装模式(装饰器模式)

定义:以透明动态的方式来动态扩展对象的功能,也是继承关系的一种代替方案(合成复用原则:组合大于继承)。允许向一个现有的对象添加新的功能,同时又不改变其结构,是作为现有类的一个包装。
*
作用:在不想增加很多子类的情况下扩展。
*
适用场景:1、扩展一个类的功能。2、动态增加功能,动态撤销。
*
实例:1、开奶茶店 (需要加各种配料)2、老婆化妆(各种化妆品) 3、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 4、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。5、汽车功能(走、跑、飞、潜水。。。)
*
优点:1、饰器模式与继承关系的目的都是要扩展对象的功能,但是装饰器模式比继承提供更多的灵活性(动态选择)。2、通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合(二维象限)。
*
缺点:装饰器模式会导致设计中出现很多小类,过度使用会使程序变得很复杂。

桥接模式

定义:将抽象部分与他的实现部分相分离,使他们都可以独立的变化。

作用:一维扩展用继承/组合,多维扩展用桥接。(实现系统可能有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间耦合。)(不是继承,而是关联)
*
抽象部分-》优化的抽象部分-》实现部分-》实现部分的具体实现
*
适用场景:1、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
*
实例:1、电脑系统组装 2、家电各种电器与品牌的关系3、汽车品牌与发电机
*
优点:抽象与实现的分离、优秀的扩展能力、实现细节对用户透明
*
缺点: 1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

模板方法模式

定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
*
作用:模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
*
适用场景:1、一次性实现一个算法的不变部分,可变的部分交给子类去实现。2、各子类中的公共行为应被提取出来并集中到一个公共父类中以避免代码重复。3、需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。
*
实例:1、学生都需要去上课,其上课的具体流程是上课、听课、下课,但是不同类学生听课(上课、下课)的具体内容不同。2、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 3、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
*
优点:1、封装不变部分,扩展可变部分。2、提取公共代码,便于维护。3、行为由父类控制,子类实现。
*
缺点:每一个不同的实现都需要一个子类去实现,导致类的个数增加,使得系统更加庞大。
*
注意事项:一般模板方法都加上final关键字,防止恶意操作。

策略模式

定义:定义了一系列的算法,并将每一个算法封装起来,而且可以使他们可以相互替换。
*
作用:让算法独立于使用他们的客户而独立变化。(在有多种算法相似的情况下,使用if…else所带来的复杂和难以维护)。
*
适用场景:1、如果在一个系统里由很多类,而这些类之间的区别仅是行为不同,那就需要用策略模式来让对象动态的在许多行为中选择一个行为。2、一个系统需要动态的在几种算法中选择一种。3、如果一个对象有很多的行为,如果使用不恰当的模式,这些行为就只好使用多重的条件语句来实现。
*
实例:1、鸭子游戏 2、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。3、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
*
优点:1、算法可以自由切换 2、避免使用多重条件判断 3、扩展性好。
*
缺点:1、策略类会很多 2、所有策略类都需要对外暴露。

观察者模式

定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。(触发联动)
*
作用:一个对象状态改变给其它对象通知的问题,而考虑到易用和低耦合,保证高度的协作。
*
可以将观察者们放进一个容器里。
*
适用场景:1、一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这些方面封装在独立的对象中使他们可以各自独立的改变和复用。2、一个对象的改变将导致其它一个或者多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。3、一个对象必须通知其他对象,而并不知道这些对象是谁。4、需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
*

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值