【C++ 设计模式】面向对象设计原则 Template Method 模式 Strategy 策略模式

一、面向对象设计原则

重新认识面向对象

理解隔离变化
• 从宏观层面来看,面向对象的构建方式更能适应软件的变化, 能将变化所带来的影响减为最小
各司其职
• 从微观层面来看,面向对象的方式更强调各个类的“责任”
• 由于需求变化导致的新增类型不应该影响原来类型的实现—— 是所谓各负其责
对象是什么?
• 从语言实现层面来看,对象封装了代码和数据。
• 从规格层面讲,对象是一系列可被使用的公共接口。
• 从概念层面讲,对象是某种拥有责任的抽象

面向对象设计原则

**依赖倒置原则(DIP) **
• 高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖 于抽象(稳定) 。
• 抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于 抽象(稳定)。
**开放封闭原则(OCP) **
• 对扩展开放,对更改封闭。
• 类模块应该是可扩展的,但是不可修改。
image.png
**单一职责原则(SRP) **
• 一个类应该仅有一个引起它变化的原因。
• 变化的方向隐含着类的责任
如果成员太多 参数太多 就容易引发责任

Liskov 替换原则(LSP)
• 子类必须能够替换它们的基类(IS-A)。
• 继承表达类型抽象

接口隔离原则(ISP)
• 不应该强迫客户程序依赖它们不用的方法。
• 接口应该小而完备
尽可能减少public 减少暴露

优先使用对象组合,而不是类继承
• 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。
• 继承在某种程度上破坏了封装性,子类父类耦合度高。 (破坏大 暴露多)
• 而对象组合则只要求被组合的对象具有良好定义的接口,耦合 度低

封装变化点 (封装的更高层次的理解 )
使用封装来创建对象之间的分界层,让设计者可以在分界层的 一侧进行修改,而不会对另一侧产生不良的影响,从而实现层 次间的松耦合

针对接口编程,而不是针对实现编程
• 不将变量类型声明为某个特定的具体类,而是声明为某个接口。
• 客户程序无需获知对象的具体类型,只需要知道对象所具有的 接口。
• 减少系统中各部分的依赖关系,从而实现“高内聚、松耦合” 的类型设计方案

面向接口设计 : 接口标准化! (产业强盛的标志 )
image.png

GOF-23 模式分类

image.png
**从封装变化角度对模式分类 : **
image.png
image.png

重构关键技法

image.png

组件协作模式

image.png

Template Method 模式

image.png
模式定义

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

image.png
image.png
image.png
俩种机制对比 :
image.png

image.png
image.pngimage.png

Strategy 策略模式

image.png

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

image.png
image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Web】NodeJs相关例题wp

目录 ①[GKCTF 2020]ez三剑客-easynode ②[MoeCTF 2021]fake game ③[安洵杯 2020]Validator ④ [HZNUCTF 2023 final]eznode ⑤[CNSS] 🏭 EzPollution_pre ⑥[CNSS]✴️ EzPollution ①[GKCTF 2020]ez三剑客-easynode const express require(express); co…

4.3、Linux进程(2)

个人主页:Lei宝啊 愿所有美好如期而遇 通过系统调用创建进程--fork函数 结果是什么呢? 为什么会出来三个打印呢? 就是因为父进程调用了fork函数创建出了子进程的task_struct,但是一个进程不止task_struct,还有代码和数据,他们…

【2021集创赛】Diligent杯一等奖:基于Cortex-M3软核的智能识别称量平台

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 杯赛题目:Diligent杯:基于FPGA开源软核的硬件加速智能平台 参赛组别:A组 设计任务: 利用业界主流软核处理器(仅限于Cortex-M系列及 RISC-V系…

Unity 头顶图文字性能优化

如图:常规的排版,会有很多Batches。这是优化后的Batches只有3。 常用解决方案: 1、创建两个Canvas,一个放所有文本Text,一个放所有Image。但这里有会有两个问题:一旦文字夹在两个Image中间,还有…

循环神经网络(RNN)实现股票预测

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据 四、数据预处理1.归一化2.设置测试集训练集 五、构建模型六、激活模型七、训练模型八、结果可视化1.绘制loss图2.预测3.评估 一、前言 我的环境: 语言环…

为什么录屏没声音?实用技巧大放送!

录屏已成为我们在数字时代记录和分享内容的重要方式之一。但有时,您可能会遇到录制视频却没有声音的问题。这个问题可能出现在不同的录屏软件中,导致许多人感到疑惑。在本文中,我们将探讨为什么录屏没声音,并提供两种解决方案&…

防雷接地+防雷工程施工综合方案

一、地凯科技防雷工程接地概述 防雷接地工程是指在建筑物或其他设施上安装防雷装置,以防止雷电对人员、设备和建筑物造成危害的工程。防雷装置主要包括避雷针(网)、引下线、接地体(网)等部分,其中接地体&a…

代码随想录刷题】Day17 二叉树04

文章目录 1.【110】平衡二叉树(优先掌握递归)1.1 题目描述1.2 解题思路1.3 java代码实现 2.【257】二叉树的所有路径(优先掌握递归)2.1 题目描述2.2 解题思路2.3 java代码实现 3.【404】左叶子之和(优先掌握递归&#…

CSS特效015:7个小球转圈圈加载效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

渲染器——快速Diff算法

讨论第三种用于比较新旧两组子节点的方式:快速Diff 算法。正如其名,该算法的实测速度非常快。该算法最早应用于 ivi 和 inferno 这两个框架,Vue.js 3 借鉴并扩展了它。 下图比较了 ivi、inferno 以及 Vue.js 2 的性能: 上图来自…

Docker Swarm总结

1、swarm 理论基础 1.1 简介 Docker Swarm 是由 Docker 公司推出的 Docker 的原生集群管理系统,它将一个 Docker 主机池变成了一个单独的虚拟主机,用户只需通过简单的 API 即可实现与 Docker 集群的通 信。Docker Swarm 使用 GO 语言开发。从 Docker 1.…

SpringBoot : ch04 整合数据源

前言 Spring Boot 是当今最流行的 Java 开发框架之一,它以简洁、高效的特点帮助开发者快速构建稳健的应用程序。在实际项目中,涉及到数据库操作的需求时,我们需要对数据源进行整合。本文将重点介绍如何在 Spring Boot 中整合数据源&#xff…

这是一棵适合搜索二叉树

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…

Tesco EDI需求分析

Tesco,成立于1919年,是一家全球领先的综合性零售企业,总部位于英国。公司致力于提供高质量、多样化的商品和服务,以满足客户的需求。Tesco的使命是通过创新和卓越的客户服务,为客户创造更美好的生活。多年来&#xff0…

【带你读懂数据手册】CN3702 一款锂电池充电芯片

大家在学习智能车或者飞行器的时候,是不是外接一个电池?最近刚好学习了一款充电芯片,来和大家分享一下,也算是我的一点点笔记。 一款7.4V锂电池,基本上也满足了单片机的外设,如果需要12V或者24V的电压&…

【前端】前端监控⊆埋点

文章目录 前端监控分为三个方面前端监控流程异常监控常见的错误捕获方法主要是 try / catch 、window.onerror 和window.addEventListener 等。Promise 错误Vue 错误React 错误 性能监控用户行为监控常见的埋点方案来源 前端监控分为三个方面 异常监控(监控前端页面…

软件临界资源访问冲突

1. 基础概念 1.1 cpu执行汇编代码 处理指令的步骤主要包括以下几步动作: 1.提取(Fetch)指令。 2.解码(Decode)指令。 3.执行(Execute)指令。 cpu运行一条汇编需要执行三个步骤,按照顺序依次执行。异常触发中断需要等待一条汇编运行完成才能跳转&…

数据库的基本概念以及MySQL基本操作

一、数据库的基本概念 1、数据库的组成 数据:描述事物的符号记录 包括数字,文字、图形、图像、声音、档案记录等 以“记录”形式按统一格式进行存储 表:将不同的记录组织在一起,用来存储具体数据 数据库: 表的集合…

Python 跨文件夹导入自定义包

一、问题再现 有时我们自己编写一些模块时,跨文件夹调用会出现ModuleNotFoundError: No module named XXX 二、解决方案 只需要在下层文件夹中的__init__.py文件中,添加如下代码即可: import sys from os import path sys.path.append(pa…

万字解析设计模式之 适配器模式

一、 适配器模式 1.1概述 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。 适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结…
最新文章