【25届秋招备战C++】23种设计模式

news2025/1/15 13:03:20

【25届秋招备战C++】23种设计模式

  • 一、简介
    • 程序员的两种思维
    • 8大设计原则
  • 二、具体23种设计模式
    • 2.1 创建型模式
    • 2.2 结构性模式
    • 2.3 行为型模式
  • 三、常考模式的实现
  • 四、参考

一、简介

从面向对象谈起,

程序员的两种思维

  • 底层思维:向下
    封装:隐藏内部实现
    多态:复用现有代码
    继承:改写对象行为
  • 抽象思维:向上

如何解决复杂性:分解或抽象。
软件设计的金科玉律:复用。

8大设计原则

  • 依赖倒置原则(DIP)
  • 开闭原则(ocp)
  • 单一职责原则(SRP)
  • Liskov替换原则(LSP)
  • 接口隔离原则(ISP)
  • 优先使用组合而非继承
  • 封装变化点
  • 针对接口编程而非针对实现编程

面向接口设计:接口标准化。

二、具体23种设计模式

2.1 创建型模式

1、工厂方法(factory method)模式:
定义一个创建对象的接口,但由子类决定需要实例化哪个类。工厂方法使得子类实例化的过程推迟。
2、抽象工厂(abstract factory)模式:
提供一个接口,可以创建一- 系列相关或相互依赖的对象,而无需指定他们具体的类。
3、原型(prototype)模式: .
用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象。
4、单例(singleton)模式:
保证一个类只有一个实例,并提供一个访问它的全局访问点
5、构建器(builder)模式:
将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示。

2.2 结构性模式

1、适配器(adapter)模式:
将一个类的接口转换成用户希望得到的另一个接口。 它使原本不相容的接口得以协同工作。
2、桥接(bridge)模式:
将类的抽象部分和它的实现部分分离开来,使它们可以独立地变化。
3、组合(composite)模式:
将对象组合成树型结构以表示“整体部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
4、装饰(decorator) 模式:
动态地给一个对象添加一-些额外的职责。它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加灵活。
5、外观(facade)模式:
定义一个高层接口,为子系统中的- -组接口提供一一个-致的外观,从而简化了该子系统的使用。
6、享元(flyweight)模式:
提供支持大量细粒度对象共享的有效方法。
7、代理(proxy)模式:
为其他对象提供一种代理以控制这个对象的访问。

2.3 行为型模式

1、职责链(chain of responsibility)模式:
通过给多个对象处理请求的机会,减少请求的发送者与接收者之间的耦合。将接收对象链接起来,在链中传递请求,直到有一个对象处理这个请求。速记关键字:传递职责
2、命令(command)模式:
将一个请求封装为-个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作。速记关键字: 日志记录,可撤销
3、解释器(interpreter)模式:
给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子。
4、迭代器(iterator)模式:
提供-一种方法来顺序访问一个聚合对象中的各个元素而不需要暴露该对象的内部表示。
5、中介者(mediator)模式:
用一个中介对象来封装一系列的对象交互。它使各对象不需要显式地相互调用,从而达到低耦合,还可以独立地改变对象间的交互。
6、备忘录(memento)模式:
在不破坏封装性的前提下,捕获一个对 象的内部状态,并在该对象之外保存这个状态,从而可用在以后将该对象恢复到原先保存的状态。
7、观察者(observer)模式:
定义对象间的一种一对多的依赖关系, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
8、状态(state)模式:
允许-一个对象在其内部状态改变时改变它的行为。
9、策略(strategy)模式:
定义一系列算法,把它们一一个个封装起来,并且使它们之间可互相替换,从而让算法可以独立于使用它的用户而变化。
10、模板方法(template method)模式:
定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。
11、访问者(visitor)模式:
表示一个作用于某对象结构中的各元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作。

三、常考模式的实现

  1. 单例

  2. 装饰器
    在这里插入图片描述

  3. 工厂模式
    在这里插入图片描述

  4. 观察者模式
    在这里插入图片描述

  5. 策略模式
    在这里插入图片描述

  6. 代理模式
    在这里插入图片描述

四、参考

B站视频
笔记
代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LVS 负载均衡部署 NAT模式

一、环境准备 配置环境: 负载调度器:配置双网卡 内网:172.168.1.11(ens33) 外网卡:12.0.0.1(ens37)二台WEB服务器集群池:172.168.1.12、172.168.1.13 一台NFS共享服务器:172.168.1.14客户端&#xff…

深入解析智能指针:从实践到原理

👦个人主页:晚风相伴 👀如果觉得内容对你有所帮助的话,还请一键三连(点赞、关注、收藏)哦 如果内容有错或者不足的话,还望你能指出。 目录 智能指针的引入 内存泄漏 RAII 智能指针的使用及原…

HTML Audio标签src使用base64字符

源码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Audio src base64</title> </head> <body><audio controls><source src"data:audio/mp3;base64,//OIxAAAAAAAAAA…

springMVC入门学习

目录 1、 什么是springmvc 2、springmvc工作流程 3、 springmvc快速入门&#xff08;XML版本&#xff09; 4、加载自定义目录下的springmvc.xml配置文件 5、 解析器InternalResourceViewResolver 6、 映射器BeanNameUrlHandlerMapping 7、 适配器SimpleControllerHandle…

【C++】---继承

【C】---继承 一、继承的概念及定义1、继承的概念2、定义语法格式3、继承基类成员访问方式的变化 二、基类 和 派生类 的对象之间的赋值转换1、赋值规则2、切片&#xff08;1&#xff09;子类对象 赋值 给 父类对象&#xff08;2&#xff09;子类对象 赋值 给 父类指针&#xf…

QT:QT与操作系统

文章目录 信号槽与事件QT多线程概述原理完成倒计时程序 UDP回显服务器服务端客户端 信号槽与事件 在之前的信号槽中&#xff0c;已经有了一个基本的认识&#xff0c;那么对于QT中事件的理解其实就非常的类似&#xff0c;当用户进行某种操作的时候&#xff0c;就会触发事件&…

pytest教程-41-钩子函数-pytest_runtest_teardown

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_runtest_call钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_runtest_teardown钩子函数的使用方法。 pytest_runtest_teardown 钩子函数在每个测试用例执行完成后被调用&…

【前端】-【前端文件操作与文件上传】-【前端接受后端传输文件指南】

目录 前端文件操作与文件上传前端接受后端传输文件指南 前端文件操作与文件上传 一、前端文件上传有两种思路&#xff1a; 二进制blob传输&#xff1a;典型案例是formData传输&#xff0c;相当于用formData搭载二进制的blob传给后端base64传输&#xff1a;转为base64传输&…

【linux kernel】linux内核hid触摸源码hid-multitouch.c剖析

文章目录 一、内核中通用hid触摸驱动二、probe过程剖析(1)hid_parse()函数(2)hid_hw_start()函数(3)hid_connect()函数三、hid-multitouch.c应用场景一、内核中通用hid触摸驱动 在linux内核中,为HID触摸面板实现了一个通用的驱动程序,位于/drivers/hid/hid-multitouch.c文件…

连续活跃天数统计

连续活跃天数统计 需求说明 什么是连续出现&#xff1f; 假设有如下日期信息&#xff1a; 20230401,20230402,20230403,20230405,20230406,20230407,20230410,20230411 则&#xff1a; 20230401-20230403 为一次连续出现&#xff0c;连续出现天数为 3 20230405-20230407 为一次…

【Qt QML】ComboBox组件

ComboBox 是一个组合的按钮和弹出列表。它提供了一种以最小的屏幕空间呈现选项列表给用户的方式。ComboBox 使用数据模型填充。数据模型通常是一个 JavaScript 数组、一个 ListModel 或一个整数&#xff0c;但也支持其他类型的数据模型。 下面是一个简单的使用方式。 import …

关于Anaconda常用的命令

常用命令 查看当前环境下的环境&#xff1a;conda env list查看当前conda的版本&#xff1b;conda --version conda create -n your_env_name pythonX.X&#xff08;2.7、3.6等)命令创建python版本为X.X。名字为your_env_name的虚拟环境。your_env_name文件可以在Anaconda安装…

专题五_位运算(3)

目录 137. 只出现一次的数字 II 解析 题解 面试题 17.19. 消失的两个数字 解析 题解 137. 只出现一次的数字 II 137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 解析 注意这里指的是比特位上的01来进行统计的 题解 class Solution { public:int sin…

二叉排序树(二叉搜索树)BST增删改查操作

一、定义 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种常用的二叉树数据结构&#xff0c;具有以下特点&#xff1a; 1. **排序性质**&#xff1a;对于树中的每个节点&#xff0c;其左子树中的所有节点值都小于该节点的值&#xff0c;而右子树…

类和对象(中篇)(未完结)

文章目录 类的6个默认成员函数构造函数析构函数 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 class Date {};空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默…

《QT实用小工具·六十一》带动画的三角形指示箭头

1、概述 源码放在文章末尾 该项目实现了一个带动画效果的三角形指示箭头&#xff0c;项目demo演示如下所示&#xff1a; 用法 interestingindicate.h interestingindicate.cpp 放到工程中&#xff0c;直接使用即可。 注意&#xff1a;建议绝对布局&#xff0c;手动指定 wid…

分红76.39亿,分红率再创新高,成长活力无限的伊利带来丰厚回报

伊利47万股东&#xff0c;又等来了一个好消息。 4月29日&#xff0c;伊利股份发布2023年报&#xff0c;实现营业总收入1261.79亿元&#xff0c;归母净利润104.29亿元&#xff0c;双创历史新高&#xff0c;实现连续31年稳健增长。 在递交亮眼成绩单的同时&#xff0c;乳业巨头伊…

Linux系统编程--网络编程

一、OSI网络七层模型 OSI模型将整个网络通信过程分解为七个层次&#xff0c;每个层次都为网络通信提供了特定的功能。以下是OSI模型的七个层次&#xff0c;从上到下依次是&#xff1a; 应用层&#xff08;Application Layer&#xff09;&#xff1a;为应用软件提供网络服务&am…

MySQL部署系列-centos离线安装MySQL

MySQL部署系列-centos离线安装MySQL 文章目录 MySQL部署系列-centos离线安装MySQL1. 查看是否已经安装 Mysql3. 下载官方 Mysql 包3. 下载之后上传到服务器4. 创建用户组5. 创建数据目录并赋予权限6. 修改配置文件 vim /etc/my.cnf7. 初始化数据库(数据库安装)8. 加入到系统服务…

多个开源的js补环境框架测试

原文链接&#xff1a;https://mp.weixin.qq.com/s/uEMFGpE5bqmTvzSgX2twvA 前言 在做js逆向时肯定会遇到补环境的情况&#xff0c;看到github开源了好几个补环境用的框架&#xff0c;这篇文章做个测试&#xff0c;看看哪个比较好用。 https://github.com/pysunday/sdenvhttp…