C++设计模式学习(二)

news2024/11/24 16:12:05

模板方法

GOF-23模式分类

在这里插入图片描述

从目的来看:
  • 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。
  • 结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。
  • 行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来
    的冲击。
从范围来看:
  • 类模式处理类与子类的静态关系。
  • 对象模式处理对象间的动态关系。

在这里插入图片描述

重构获得模式

面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指是那些可以满足 “应对变化,提高复用”的设计 。

现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而来更好地应对需求的变化”.“什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更为重要。

设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好的使用设计模式的方法。

一般来说都要使用重构的方法进行完善。

重构关键技法
  • 静态 -> 动态

  • 早绑定 -> 晚绑定

  • 继承 -> 组合

  • 编译时依赖 -> 运行时依赖

  • 紧耦合 -> 松耦合

组件协作”模式

  • 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式
    • Template Method(模板方法)
    • Observer / Event(观察者方法)
    • Strategy(策略模式)

Template Method 模式

动机
  • 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。

  • 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

举例

在这里插入图片描述

Library与Application是早绑定的
在这里插入图片描述

Library与Application是晚绑定的

模式定义

定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。

相对稳定的算法骨架是使用 Template Method 模式的前提。

如果算法是完全稳定的或者是完全变化的那么都不能使用设计模式。因为设计模式是在算法的稳定中间设置隔离点去分离出来,将变化限制在一个范围之内。

结构

在这里插入图片描述

要点
  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

  • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是 Template Method 的典型应用。

  • 在具体实现方面,被 Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

c语言也可以利用函数指针实现晚绑定。

策略模式

动机

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

模式定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。

结构

在这里插入图片描述

Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。

代码层面的复制粘贴不是真正的复用,真正的复用是二进制层面的复用。子类化的方式取拓展程序。

只要是代码中存在if或者switch且可能拓展的情况都可以使用策略模式。代码层面的复制粘贴(if else)会产生额外的性能负担。如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

高层不能依赖低层模块,实现细节依赖抽象,抽象不能依赖实现细节

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

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

相关文章

python+django家庭个人理财收支管理系统5x6nf

根据收支管理系统的功能需求,进行系统设计。 用户功能:用户进入系统可以实现每日收入、每日支出等功能进行操作; 管理员功能,管理员功能包括用户管理、收入分类、支出分类、每日收入、每日支出等功能管理; 决当前的问题…

Niagara—— System和Emitter节点

目录 一,发射器节点 Properties Emitter Spawn Emitter Update Particle Spawn Particle Update Renderer 二,系统节点 Properties System Spawn System Update Niagara是按照从上到下按顺序,依次执行模块Module(可编程…

「实在RPA·金融数字员工」为风险防范摁下快捷键实在智能RPA实在智能RPA​

2023年度政府工作报告提出,要大力发展数字经济,提升常态化监管水平,支持平台经济发展,完善金融体制改革,加强金融风险防范。在国家政策的有力支持下,金融行业的数字化转型正如火如荼进行中。 一、金融业数…

每日互动(个推)CTO叶新江:AIGC时代,大模型推动数据要素商业化

ChatGPT在一夜之间火爆互联网,让AIGC受到世界范围内的高度关注。时至今日,AIGC热度持续高涨,各大互联网公司争相布局这一领域。日渐成熟的技术、显著的降本增效优势以及日益增长的市场需求等因素,已经推动AIGC成为互联网公司新一轮…

理解VXLAN网络

什么是VXLAN? 在三层可达的网络中部署VXLAN,在每个VXLAN网络端点中都有一个VTEP设备,负责将VXLAN协议的数据包进行UDP数据包的封包和解包,可以将其理解为隧道,将VXLAN数据包从逻辑网络转发到物理网络 VXLAN使用24位的VXLAN网络…

【Flutter 工程】003-钩子函数:Flutter Hooks

【Flutter 工程】003-钩子函数:Flutter Hooks 文章目录 【Flutter 工程】003-钩子函数:Flutter Hooks一、概述1、前言2、Flutter Hooks 概述 二、useState 基本使用0、计数器官方 demo1、安装 flutter_hooks2、代码改造3、运行结果4、神奇的事情 三、使用…

一个合格的IT信息化公司需要具备哪些资质?

今天智达鑫业小编给大家汇总下目前信息化企业具有的一些常见资质证书有哪些, 正规IT企业应具备以下资质,具有的资格以及与此资格相适应的质量等级标准。专业的it企业资质包括经营资质四项资质、能力资质六项资质 1、it企业资质经营资质 【双软企业认定…

常用监控方案 Prometheus + Grafana 简单使用小结

文章目录 前言一、概念1.1 发展1.2 时序数据1.3 Metric 二、Prometheus2.1 架构2.2 配置2.3 查询语言PromQL2.4 Exporter 三、Grafana3.1 数据源3.2 权限3.3 面板可视化3.4 仪表盘 四、实战4.1 监控 Windows/Linux4.2 监控 JVM4.3 监控 MySQL4.4 监控 Springboot API 参考 前言…

拿森Onebox 2.0新品发布,已获多家车企定点,明年出货量将达百万台

近日,拿森科技在上海举办了2023年新品发布会,重磅发布了拿森Onebox 2.0集成式智能制动系统(NBC)。 该产品采用全解耦式制动技术,集成了行车制动、驻车制动、车辆稳定性控制等全部功能,包括协调式能量回收、…

Springboot中使用mail邮件

Springboot中使用mail邮件发送 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务2、导入依赖和一些默认#配置新的3、发送邮件4、整合工具类 1、配置邮箱的POP3/SMTP服务和IMAP/SMTP服务 这里使用的是QQ邮箱,进入设置-账户,开启下服务。 开启后获取授权码,保存…

华秋DFM软件迭代升级,让用户拥有更好的体验

华秋DFM软件在不断改进和升级的过程中,积极收集和了解用户的需求和反馈,不断提高软件的功能实用性和用户体验。在本次软件迭代中,华秋DFM软件针对以下功能点进行了优化和改进,以让操作更加便捷、让用户拥有更好的体验!…

365天深度学习打卡 第P9周:YOLOv5的backbone实现

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊|接辅导、项目定制 文章目录 一、Backbone模块代码1.1 Conv模块1.2 C3模块Bottleneck模块SPPF模块 二、数据集和相关参数设置2.1 数据集操作2.2 相关参数设置2.3…

chatgpt赋能python:Python修改密码:一种安全可靠、快速高效的方式

Python 修改密码:一种安全可靠、快速高效的方式 在数字化时代,越来越多的信息被存储在计算机系统中,因此密码的保护变得尤为重要。人们需要保证他们的密码是安全可靠的,并定期更换密码。Python作为一种强大而且通用的编程语言&am…

Unity用鼠标拖拽UI,UI跟随鼠标移动

Unity用鼠标拖拽UI,UI跟随鼠标移动 效果一、原理二、源码总结💢💢版权声明 效果 先上效果 一、原理 继承几个拖拽的接口 IBeginDragHandler, IDragHandler,IEndDragHandler 计算下偏移量,转换下坐标系 限制下可拖拽的范围&…

Tensorflow2基础代码实战系列之时间序列预测任务

深度学习框架Tensorflow2系列 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark …

实时时钟 RTC

概述 实时时钟(RTC) 模块可长时间维持精确计时,为系统提供实时时钟和日历。该模块功耗极低,最大程度延长电池寿命。 RTC的主要特点: ⚫ BCD 时间 格式 ,完整万年历 ⚫ 支持数字调校, 最高 精度可达 0. 06 ppm ⚫ 可输出…

作为996社畜,如何自学Python?一文讲清楚

作为996社畜,应该如何自学Python?今天就给大家分享一下,工作之余,应该如何学习Python? 1. 明确目标 对于零基础的学员而言,要明确你学习Python仅仅是为了满足好奇心?还是有工作需要&#xff0c…

如何使用ArcGIS制作气温空间分布图

本文使用ArcMap10.2,以湖北省为例,通过空间插值,制作湖北省1981-2010年20年平均气温空间分布图 树谷资料库资源大全 1 数据准备 可在中国气象数据网下载湖北省1981-2010共20年的各区站累年平均气温数据和各区站经纬度数据。打开为txt格式 在…

【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)

【学习难度:★★★★☆,使用频率:★★★★★】 3.1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中…

【计算机网络】网络基础(一)

首先声明:这是开发中用到的网络的知识点,侧重点在于编程实践,不重视概念。网络基础不在于细节,在于构建宏观的结构。后面重点在于网络套接字编程!!!!! 目录 1.背景知识 …