设计模式的学习
OO:Object-Oriented
面向对象
---
《Head First设计模式》
这本书是用java写的,我是写C++的,用C++来写相关的代码
---
p2(第二页)
#ifndef DUCK_H
#define DUCK_H/*** @brief The Duck class 鸭子类*/
class Duck
{
public:Duck();/*** @brief quack 呱呱叫* 所有的鸭子都会呱呱叫* 所以在父类中实现这部分代码*/void quack();/*** @brief swim 游泳* 所有的鸭子都会游泳* 所以在父类中实现这部分代码*/void swim();/*** @brief display 展示鸭子的外观* 每种鸭子的外观特点不同,需要在子类中进行实现* 所以这里是虚函数*/virtual void display();
};#endif // DUCK_H
#ifndef MALLARDDUCK_H
#define MALLARDDUCK_H#include "duck.h"
/*** @brief The MallardDuck class 绿头鸭*/
class MallardDuck : public Duck
{
public:MallardDuck();virtual void display();
};#endif // MALLARDDUCK_H
#ifndef MALLARDDUCK_H
#define MALLARDDUCK_H#include "duck.h"
/*** @brief The MallardDuck class 绿头鸭*/
class MallardDuck : public Duck
{
public:MallardDuck();virtual void display();
};#endif // MALLARDDUCK_H
---
现在需要添加需求:一部分鸭子会飞。
如果直接在基类中添加fly(),那么意味着所有的鸭子都会飞。(所有的子类都拥有了fly() )
而橡皮鸭子是不会飞的。
---
当涉及“维护”时,为了复用目的而使用继承,并不是完美的。
---
如果子类把fly()方法覆盖掉呢?
可以,但如果再加入一种不会飞的鸭子,那么需要重新再覆盖fly()方法。
void fly()
{//覆盖,什么事都不做
}
每多一种鸭子,就需要覆盖一次fly()方法。
------
而有些鸭子不会飞,也不会叫。
---
希望找到一种建立软件的方法,让我们可以用一种对既有的代码影响最小的方式来修改软件。
这样我们就可以花较少时间重做代码,而让程序去做更酷的事。
---
继承不能很好地解决问题,因为鸭子的行为在子类中不断地改变,并且让所有的子类都有这些行为是不恰当的。
Flyable和Quackable接口一开始似乎还不错,但继承接口无法达到代码的复用。
当需要修改某个行为时,需要在定义此行为的类中修改它。
---
设计原则:
找出应用中可能需要变化之处,把它们独立出来,不要和不需要变化的代码混在一起。
---
努力让系统中的某部分改变不会影响其他部分。
---
设计原则:
针对接口编程,而不是针对实现编程。
---
简单的多态例子:
有一个抽象类Animal,两个具体的实现:Dog和Cat继承自Animal
针对实现编程:
Dog d = new Dog();
d.bark();
针对接口编程:
Animal * animal = new Dog();
animal.makeSound();
子类实例化的动作不再需要在代码中硬编码,而是在运行时才指定具体实现的对象,
进一步封装:
a = getAnimal();
a.makeSound();
我们不关心实际的子类型是什么,我们只关心它知道如何正确地调用makeSound()。
---
#ifndef FLYBEHAVIOR_H
#define FLYBEHAVIOR_H
#include <QDebug>
/*** @brief The FlyBehavior class 飞行行为*/
class FlyBehavior
{
public:FlyBehavior(){}virtual void fly(){}
};/*** @brief The FlyWithWings class 用翅膀飞行*/
class FlyWithWings : public FlyBehavior
{
public:FlyWithWings(){}virtual void fly(){qDebug()<<"用翅膀飞行";}
};/*** @brief The FlyNoWay class 不会飞行*/
class FlyNoWay : public FlyBehavior
{
public:FlyNoWay(){}virtual void fly(){qDebug()<<"不会飞行";}
};#endif // FLYBEHAVIOR_H
#ifndef FLYBEHAVIOR_H
#define FLYBEHAVIOR_H
#include <QDebug>
/*** @brief The FlyBehavior class 飞行行为*/
class FlyBehavior
{
public:FlyBehavior(){}virtual void fly(){}
};/*** @brief The FlyWithWings class 用翅膀飞行*/
class FlyWithWings : public FlyBehavior
{
public:FlyWithWings(){}virtual void fly(){qDebug()<<"用翅膀飞行";}
};/*** @brief The FlyNoWay class 不会飞行*/
class FlyNoWay : public FlyBehavior
{
public:FlyNoWay(){}virtual void fly(){qDebug()<<"不会飞行";}
};#endif // FLYBEHAVIOR_H
关键在于:
鸭子现在会将飞行和呱呱叫的动作“委托”别人处理,而不是使用定义在Duck类或子类内的呱呱叫和飞行方法。
#ifndef DUCK_H
#define DUCK_H#include "flybehavior.h"
#include "quackbehavior.h"
/*** @brief The Duck class 鸭子类*/
class Duck
{
public:Duck();FlyBehavior * flyBehavior;QuackBehavior * quackBehavior;void performQuack(){quackBehavior->quack();}void performFly(){flyBehavior->fly();}/*** @brief display 展示鸭子的外观* 每种鸭子的外观特点不同,需要在子类中进行实现* 所以这里是虚函数*/virtual void display(){}
};#endif // DUCK_H
#ifndef MALLARDDUCK_H
#define MALLARDDUCK_H#include "duck.h"
/*** @brief The MallardDuck class 绿头鸭*/
class MallardDuck : public Duck
{
public:MallardDuck();virtual void display(){}
};#endif // MALLARDDUCK_H
#include "mallardduck.h"MallardDuck::MallardDuck()
{flyBehavior = new FlyWithWings();quackBehavior = new MuteQuack();
}
MallardDuck mallardDuck;mallardDuck.performFly();mallardDuck.performQuack();

---
通过基类的指针析构子类时,会出现内存泄漏吗?
如果不希望内存泄漏,析构函数必须定义为虚函数。
---
设计原则:
多用组合,少用继承。
使用组合建立系统具有很大的弹性,不仅可将算法族封装成类,更可以“在运行时动态地改变行为”。
策略模式:
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
上面的鸭子示例中:可以在运行时动态地切换鸭子相关的行为(算法)(用翅膀飞,不会飞)
------
设计是一门艺术,总是有许多可取舍的地方。
设计大师关心的是建立弹性的设计,可以维护,可以应付变化。
相关文章:
设计模式的学习
OO:Object-Oriented 面向对象 --- 《Head First设计模式》 这本书是用java写的,我是写C的,用C来写相关的代码 --- p2(第二页) #ifndef DUCK_H #define DUCK_H/*** brief The Duck class 鸭子类*/ class Duck { public:D…...
wordpress发邮件SMTP服务器配置步骤指南?
wordpress发邮件功能如何优化?怎么用wordpress发信? 由于WordPress默认的邮件发送功能可能不够稳定,配置SMTP服务器成为了许多网站管理员的选择。AokSend将详细介绍如何在WordPress中配置SMTP服务器,以确保邮件能够顺利发送。 w…...
胤娲科技:机械臂「叛逃」记——自由游走,再悄然合体
夜深人静,你正沉浸在梦乡的前奏,突然意识到房间的灯还亮着。此刻的你,是否幻想过有一只无形的手,轻盈地飘过,帮你熄灭那盏碍眼的灯? 又或者,你正窝在沙发上,享受电视剧的紧张刺激&am…...
分布式事务讲解 - 2PC、3PC、TCC
分布式事务讲解 - 2PC、3PC、TCC 前置知识 BASE理论: BASE是Basically Availbale(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)三个词语的缩写。BASE理论是对CAP理论中AP的一个扩展,通过牺牲强一致性来获得可用性,当…...
前端基础面试题·第四篇——Vue(其二)
1.Vue中路由传参 1.params传参 params 传参是通过URL路径来传递参数,这种方式传递的参数是必选的。这种传参方式需要在路由配置时在路由路径位置提前指定参数。 路由配置 const router new VueRouter({routes: [{path: /user/:id, // 这里的:id就是参数name: u…...
PHP反射
文章目录 介绍基本用法基本的反射示例1. 反射类2. 反射方法3. 反射属性4.反射全局函数5.反射函数的参数 优势和注意事项优势:注意事项: 介绍 PHP反射是一种强大的机制,允许在运行时检查类、接口、方法、属性等的结构和元数据。它可以用于许多…...
Gated Transformer Networks for Multivariate Time Series Classification
博客贡献人 徐宁 作者 Minghao Liu , Shengqi Ren , Siyuan Ma , Jiahui Jiao , Yizhou Chen , Zhiguang Wang(Facebook AI) and Wei Song∗ 标签 多元时间序列分类,Transformer,门控 摘要 用于时间序列分类的深度学习模型(主要是卷积网…...
这一次,AI真的能帮你实现职场跃迁
你有没有想过: AI不仅能帮你实现工作提效 还能帮你实现职场跃迁! 根据行业报告,近年来**AIGC(AI Generated Content)**领域岗位数量井喷式增长,AI大模型产品经理作为连接技术与市场的桥梁,正扮…...
Python绘制--绘制心形曲线
今天,我们将通过Python代码来绘制一个心形曲线,这是一个经典的数学表达。 一、心形曲线的数学原理 心形曲线,也被称为心脏曲线,是一个代数曲线,可以通过参数方程定义。其数学表达式如下: x16sin3(t)x16…...
初识Linux · 自主Shell编写
目录 前言: 1 命令行解释器部分 2 获取用户命令行参数 3 命令行参数进行分割 4 执行命令 5 判断命令是否为内建命令 前言: 本文介绍是自主Shell编写,对于shell,即外壳解释程序,我们目前接触到的命令行解释器&am…...
海报设计模板免费的好用吗?活动海报排版技巧轻松get
虽然今年所有的法定节假日已经过完了,但对于电商打工族来说,需要制作活动海报的节日,还有很多吧...... 刚听到小道消息,说是今年的双十一,从十月十四号就开始预热了! 怎么样,大家的预热活动海…...
【Linux基础】03 Linux环境基础开发工具使用
1. yum ——软件包管理器 yum 是我们 Linux 预装的一个指令,搜索、下载、、安装对应的软件 yum 相当于 Linux 的应用商店! 安装与卸载 yum list | grep command 通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我…...
【CSS】flex: 1; 的意思
在 Flexbox 布局中,flex: 1; 是一个简写属性,它表示弹性容器中的子元素如何分配可用空间。flex: 1 意味着该元素可以根据剩余的空间进行扩展,占据相应的比例。具体来说,flex: 1; 是 flex-grow、flex-shrink 和 flex-basis 这三个属…...
C++ 3D冒险游戏开发案例
3D冒险游戏的C开发案例,包括游戏设计、实现细节、图形渲染、音效处理等内容。 3D冒险游戏开发案例 一、游戏设计 游戏概述 游戏名称:“探索者的传奇”类型:3D冒险游戏目标:玩家控制角色在一个开放的世界中探索、解谜、战斗并完成…...
【AIGC】Exa AI 要做 AI 领域的 Google
又一个AI搜索引擎诞生:Exa AI。 与其他旨在取代谷歌的AI驱动搜索引擎不同,Exa的目标是创建一个专门为AI设计的搜索工具。 Exa的使命: 互联网包含人类的集体知识,但目前的搜索体验更像在垃圾场中导航,而非在知识图书馆中漫游。核…...
YOLOv8 基于MGD的知识蒸馏
YOLOv8 基于MGD的知识蒸馏 接着上一篇我们介绍了YOLOv8的剪枝方案和代码,本篇文章将剪枝后的模型作为学生模型,剪枝前的模型作为教师模型对剪枝模型进行蒸馏,从而进一步提到轻量模型的性能。 Channel-wise Distillation (CWD) 问题和方法 …...
全国消防知识竞赛活动方案哪家强
关键词:消防安全、预防火灾、消防意识、消防员、防火安全 适合行业:所有行业 推荐功能:答题、投票、H5 宣传角度 1.从日常生活场景出发,指导大家如何检查家庭中的火灾隐患。例如检查电线是否老化、插座是否过载、是否在楼梯间…...
JavaEE学习一条龙服务————概述
鉴于之前的笔记较乱,没有逻辑关系,,博主决定从JacaEE整个学习的阶段出发,整理一系列博客,供大家学习交流,提升自己。 此文章已绑定一篇我为大家梳理的JavaEE一条龙学习知识点的文档,大家可下载…...
分支预测器BPU
分支预测器BPU 0 Intro0.1 CPU执行过程0.2 分支预测0.2.1 TAGE预测器0.2.2 跳转地址 分支预测器BPU是深入研究一个高性能处理器的一个很好的开始项目; 0 Intro 条件分支是指后续具有两路可执行的分支。可以分为跳转分支(taken branch)和不跳转分支(not-taken branc…...
Go 系列教程 —— 数组和切片
数组 数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(译者注:当然,如果是 interface{} 类型数组,可以包含任意类型…...
Phi-4-mini-reasoning应用场景:科研助理——论文公式推导验证与符号计算辅助
Phi-4-mini-reasoning应用场景:科研助理——论文公式推导验证与符号计算辅助 1. 模型概述 Phi-4-mini-reasoning是一款由微软开发的轻量级开源模型,专注于数学推理和逻辑推导任务。这个3.8B参数的模型虽然体积小巧,但在强逻辑任务上表现出色…...
小红书内容保存难题,这款Python工具如何实现一键无水印下载?
小红书内容保存难题,这款Python工具如何实现一键无水印下载? 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作…...
电机轴承异响?5分钟教你用振动分析仪定位故障(附实测案例)
电机轴承异响诊断实战:振动分析仪操作全流程解析 轴承异响是工业现场最常见的电机故障之一,但很多维护工程师面对"嗡嗡"声或"咔嗒"响往往无从下手。上周某化工厂的水泵电机就因轴承早期磨损未被及时发现,导致整机报废&am…...
Frappe-Gantt 甘特图进阶实战:从核心功能到企业级定制
1. Frappe-Gantt 甘特图在企业级项目中的核心价值 第一次接触Frappe-Gantt是在去年一个跨部门协作的电商大促项目中。当时我们需要一个能直观展示各环节时间节点的工具,试过几个商业软件后,最终选择了这个开源的轻量级解决方案。它最吸引我的地方在于——…...
PyTorch 2.8镜像惊艳案例:碳排放数据→双碳目标达成路径视频推演
PyTorch 2.8镜像惊艳案例:碳排放数据→双碳目标达成路径视频推演 1. 效果惊艳开场 想象一下,只需输入简单的碳排放数据,就能自动生成一段专业级的双碳目标达成路径推演视频。这不是科幻场景,而是我们基于PyTorch 2.8镜像实现的真…...
方寸陶瓷藏乾坤:百能云板用陶瓷基板四大核心工艺,赋能万物互联时代
当你驾驶新能源汽车平稳穿梭在城市街巷,当深夜的 LED 路灯精准照亮回家的路,当手机人脸识别瞬间解锁生活便捷 —— 你或许不会想到,这些场景的背后,都离不开一块 “隐形基石”:陶瓷散热基板。作为电子设备的 “散热心脏…...
为什么28S与18S rRNA比值可用于评估RNA质量?
在分子生物学实验中,获得高质量RNA样本是基因表达分析、转录组测序等研究成功的关键前提。在众多RNA质量评估方法中,28S与18S核糖体RNA的比值长期被广泛用作实验室中的“黄金标准”。这一标准为何如此受重视?其背后有着明确的原理与判断依据。…...
电子元器件失效分析与预防实战指南
1. 电子元器件失效的底层逻辑剖析 电子元器件失效的本质是材料特性、环境应力与时间因素共同作用的结果。作为一名硬件工程师,我处理过数百例元器件失效案例,发现失效模式往往遵循"应力-损伤-失效"的因果链。理解这个链条,才能从根…...
AI 模型调度平台的系统架构
AI模型调度平台的系统架构:智能时代的核心引擎 在人工智能技术飞速发展的今天,AI模型调度平台成为企业实现智能化转型的关键基础设施。它通过高效管理、调度和优化AI模型资源,帮助用户快速部署和运行复杂的AI任务。本文将深入解析AI模型调度…...
Windows HEIC缩略图支持:让资源管理器直接预览HEIC文件的完整方案
Windows HEIC缩略图支持:让资源管理器直接预览HEIC文件的完整方案 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 跨平台图…...
