设计模式(1) - UML类图

1、前言

最近在阅读 Android 源码,时常碰到代码中有一些巧妙的写法,简单的如 MediaPlayerService 中的 IFactory,我知道它是工厂模式,但是却不十分清楚它为什么这么用;复杂点的像 NuPlayer 中的 DeferredActions 机制,我只能慢慢揣摩它是如何工作的,最终也能琢磨出个大差不差;有些特点不太鲜明的如 NuPlayer Source 中的 wrapper,我就不是很理解它为什么要这么写了。

深入 Android 源码细节实现时,常常因为不理解其中这些设计的思路,从而看的云里雾里,觉得作者写的晦涩难懂;有的时候猛然揣摩出作者的用意,又觉得豁然开朗,拍手叫好。一前一后两种不同的心境,我觉得差别在于是否了解设计模式。

了解设计模式可以让我在阅读优秀工程时能够更好更快地了解代码架构、作者意图,更轻松地学习内部实现,最后能够更加灵活地运用。

2、UML 类图

庞大的工程往往具有相当多且复杂地类,阅读这些类时我们常常会用 UML 类图来展示复杂的类关系。以下是一个简单的 UML 类图示例:
请添加图片描述

  • 车是一个抽象类;
  • 汽车继承于车,它和车的关系为实现关系,使用带空心箭头的虚线表示;
  • 轿车和汽车之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
  • 发动机与汽车之间是组合关系,使用带实心箭头的实线表示;
  • 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
  • 学生和校园卡之间为关联关系,使用带箭头的实线表示;
  • 学生上学要用自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;

3、类之间的关系

3.1、实现关系

实现关系指的是将抽象概念变成现实实现。拿上面的示例来说,我们只知道车可以移动,但是不知道车长什么样子,要如何移动,所以它只是一个概念。汽车包含有发动机、变速箱等组件,踩油门就可以移动;自行车两个轮胎一个把手,用脚踩就可以移动。汽车和自行车将虚无的(抽象)概念变成现实,所以用带虚线的箭头表示实现关系。

在代码中,实现关系表现为继承抽象类。

3.2、泛化关系

泛化关系指的是具体事物的不同形态。同样拿车为例子,我们已经知道车由变速箱、发动机等组成,但是它们仍可以组成不同的形态,如轿车和SUV,它们都属于汽车,但是又有各自的特点。

在代码中,泛化关系表现为继承非抽象类;

以 MediaPlayerInterface.h 为例,MediaPlayerInterface 继承于 MediaPlayerBase,并且实现了 hardwareOutput,这个关系是属于实现还是泛化关系呢?

个人以为是泛化关系,将 MediaPlayerBase 泛化为使用 software mixer 和 hardware output 两种 player。泛化关系常常会修改基类方法或者是新增对外接口,可能会影响多态的使用(需要做强转才能调用泛化类的新接口)。

例如 MediaPlayerBase 在实际使用中需要做强制转换才能实现 setAudioSink 的调用。

	sp<MediaPlayerBase> p = createPlayer(playerType);if (!p->hardwareOutput()) {mAudioOutput = new AudioOutput(mAudioSessionId, mAttributionSource,mAudioAttributes, mAudioDeviceUpdatedListener);static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput);}

泛化关系见的比较少,下次碰见再补充到这里

3.3、聚合关系

聚合关系指的是整体和个体,整体由个体组成,但是整体不存在并不会影响个体。例如 buffer list 和 buffer 的关系,buffer 可以组成 buffer list,buffer list 不存在并不会影响 buffer。

3.4、组合关系

组合关系表示的是部分和整体的关系,它和聚合关系由比较大的区别,组合关系的整体不存在了,部分也就不存在了,反之也一样。

可能有的人会不理解什么叫“整体不存在了部分也就不存在了;部分不存在了整体也不存在了”,这里以 ACodec.h 为例,ACodec 中有一个 mBufferChannel 成员,ACodec 销毁了,那么 mBufferChannel 也就随之销毁了,这里体现的就是组合关系;如果 mBufferChannel 销毁了,那么 ACodec 自然也就无法工作了。

之前看汽车和发动机的例子会有一些疑惑,明明发送机可以独立存在,为什么它和汽车还是组合关系呢?应该是这么理解,如果没有汽车,也就没有发动机存在的必要了,所以说是没有整体也就没有部分。

组合关系比聚合关系更加强烈,所以用的是黑色箭头。

在代码中,聚合关系 和 组合关系通常以成员变量体现出来,具体属于哪一种还需要自己揣摩。

3.5、关联关系

个人理解关联关系表示的是拥有,比如说学生拥有自行车,那么学生就和自行车有了关联。

在代码中,关联关系同样是以成员变量体现出来,但是属于拥有的关系,和上面的组合与聚合不一样,并不需要自行车才能够组成一个人。

3.6、依赖关系

依赖关系表示的是调用的关系,它是一种临时性关系,在代码中体现为参数传入。再举个例子,学生每天骑共享单车上学,车不属于学生,但是学生每天需要使用自行车,这就属于依赖关系。如果学生有了车,那么可能就要归类于关联关系了。

好了,以上就是我对 UML 图绘制以及类之间关系的个人理解,如果有误欢迎指出~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vulhub-tomcat弱口令

1.启动靶场 进入文件 进入目录 进入到靶场 启动靶场 docker-compose up -d 2.查看 ip地址 3.使用nmap对ip进行 扫描 发现存在8080的端口&#xff0c;并且端口是开放的状态&#xff0c;apache&#xff0c;tomcat搭建的 4.访问ip地址的端口 点击Manager app 6.开启BP进行抓包 随…

vue-cli3项目本地启用https,并用mkcert生成证书

在项目根目录下的vue.config.js文件中&#xff1a; // vue.config.js module.exports {devServer: {host:dev.nm.cngc// 此处开启 https,并加载本地证书&#xff08;否则浏览器左上角会提示不安全&#xff09;https: {cert: fs.readFileSync(path.join(_dirname,./cert.crt)…

UI自动化之混合框架

什么是混合框架&#xff0c;混合框架就是将数据驱动与关键字驱动结合在一起&#xff0c;主要用来回归业务主流程&#xff0c;将核心流程串联起来。 上一篇我们写到了关键字驱动框架&#xff0c;关键字驱动框架是针对一个业务场景的单条测试用例的。 我们以163邮箱的登录到创建…

云计算中的负载均衡技术,确保资源的平衡分配

文章目录 1. 硬件负载均衡器2. 软件负载均衡器3. DNS负载均衡4. 内容分发网络&#xff08;CDN&#xff09; &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内…

【负载均衡】常见的负载均衡策略有哪些?

文章目录 前言负载均衡分类常见负载均衡策略小结 前言 负载均衡策略是实现负载均衡器的关键&#xff0c;而负载均衡器又是分布式系统中不可或缺的重要组件。使用它有助于提高系统的整体性能、可用性、可靠性和安全性&#xff0c;同时支持系统的扩展和故障容忍性。对于处理大量…

el-form表单动态校验(场景: 输入框根据单选项来动态校验表单 没有选中的选项就不用校验)

el-form表单动态校验 el-form常规校验方式: // 结构部分 <el-form ref"form" :model"form" :rules"rules"><el-form-item label"活动名称: " prop"name" required><el-input v-model"form.name" /…

面试中的时间管理:如何在有限时间内展示最大价值

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

客户端发现pod并与之通信

客户端发现pod并与之通信 pod需要一种寻找其他pod的方法来使用其他pod提供的服务&#xff0c;不像在没有Kubernetes的世界&#xff0c;系统管理员要在用户端配置文件中明确指出服务的精确IP地址 或者主机名来配置每个客户端应用&#xff0c;但同样的方法在Kubernetes中不适用 …

IIS WebDAV配置,https绑定及asp设置

IIS支持标准CGI&#xff0c;因此可以用程序语言针对STDIN和STDOUT开发。 IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 IIS支持脚本解释CGI&#xff0c;因此可以用脚本语言针对STDIN和STDOUT开发。 IIS perl python cbrother php脚本语言配置…

(二十三)大数据实战——Flume数据采集之采集数据聚合案例实战

前言 本节内容我们主要介绍一下Flume数据采集过程中&#xff0c;如何把多个数据采集点的数据聚合到一个地方供分析使用。我们使用hadoop101服务器采集nc数据&#xff0c;hadoop102采集文件数据&#xff0c;将hadoop101和hadoop102服务器采集的数据聚合到hadoop103服务器输出到…

3dMax全球学习资源、资源文件和教程 !

此样例教育教程和学习资源旨在提供使用Autodesk 3ds Max时的计划知识和培训、正确的工作流、流程管理和最佳实践。 您在Autodesk三维设计领域的职业生涯 有关使用3ds Max和Maya在计算机图形领域开始职业生涯的提示&#xff08;包括新的3ds Max和Maya介绍教程&#xff0c;以复…

vmware fusion12共享文件夹到虚拟机window10

文章目录 一、window10虚拟机安装VMware Tools二、MAC配置共享文件夹三、使用 一、window10虚拟机安装VMware Tools vmware fusion—虚拟机----安装VMware Tools–一路下一步 确认安装 双击进行安装 一路下一步&#xff0c;傻瓜式安装 二、MAC配置共享文件夹 设置—系…

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…

类的加载过程

清楚每个环节的操作过程就可以了 1.加载Loading 加载过程&#xff1a; 通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.class对象&#xff0c;作为方法区这个类的各种数…

Gitea--私有git服务器搭建详细教程

一.官方文档 https://docs.gitea.com/zh-cn/说明 gitea 是一个自己托管的Git服务程序。他和GitHub, Gitlab等比较类似。他是从 Gogs 发展而来&#xff0c;gitea的创作团队重新fork了代码&#xff0c;并命名为giteagitea 功能特性多&#xff0c;能够满足我们所有的的代码管理需…

nowcoder NC10 大数乘法

题目链接&#xff1a; https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId196&tqId37177&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficultyundefined&judgeStatusundefined&tags&tit…

《异常检测——从经典算法到深度学习》22 Kontrast: 通过自监督对比学习识别软件变更中的错误

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

Unity中Shader的屏幕坐标

文章目录 前言一、屏幕坐标1、屏幕像素的坐标2、屏幕坐标归一化 二、在Unity中获取 当前屏幕像素 和 总像素1、获取屏幕总像素,使用_ScreenParams参数2、获取当前片段上的像素怎么使用:在片元着色器传入参数时使用 前言 Unity中Shader的屏幕坐标 一、屏幕坐标 1、屏幕像素的坐…

非科班菜鸡算法学习记录 | 代码随想录算法训练营第58天|| 单调栈! 739. 每日温度 496.下一个更大元素 I

739. 每日温度 输入一个数组&#xff0c;找比i天温度高的第一天 知识点&#xff1a;单调栈 状态&#xff1a;看思路自己写 思路&#xff1a; 看自己写的注释&#xff0c;维护一个单调栈 // 版本一 class Solution { public:vector<int> dailyTemperatures(vector<…

视频导出文件太大如何变小?缩小视频这样做

作为一名视频制作爱好者&#xff0c;我们经常需要导出视频文件&#xff0c;但是&#xff0c;有时候我们会发现导出的视频文件太大&#xff0c;给上传和分享带来很大的不便。那么&#xff0c;如何将视频文件变小呢&#xff1f;下面将为你介绍三个方法&#xff0c;让你轻松解决视…