做网站安全的公司有哪些,网站首页权重,义乌网站建设技术托管,微信视频网站怎么做的好1、前言
最近在阅读 Android 源码#xff0c;时常碰到代码中有一些巧妙的写法#xff0c;简单的如 MediaPlayerService 中的 IFactory#xff0c;我知道它是工厂模式#xff0c;但是却不十分清楚它为什么这么用#xff1b;复杂点的像 NuPlayer 中的 DeferredActions 机制…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 的调用。 spMediaPlayerBase p createPlayer(playerType);if (!p-hardwareOutput()) {mAudioOutput new AudioOutput(mAudioSessionId, mAttributionSource,mAudioAttributes, mAudioDeviceUpdatedListener);static_castMediaPlayerInterface*(p.get())-setAudioSink(mAudioOutput);}泛化关系见的比较少下次碰见再补充到这里
3.3、聚合关系
聚合关系指的是整体和个体整体由个体组成但是整体不存在并不会影响个体。例如 buffer list 和 buffer 的关系buffer 可以组成 buffer listbuffer list 不存在并不会影响 buffer。
3.4、组合关系
组合关系表示的是部分和整体的关系它和聚合关系由比较大的区别组合关系的整体不存在了部分也就不存在了反之也一样。
可能有的人会不理解什么叫“整体不存在了部分也就不存在了部分不存在了整体也不存在了”这里以 ACodec.h 为例ACodec 中有一个 mBufferChannel 成员ACodec 销毁了那么 mBufferChannel 也就随之销毁了这里体现的就是组合关系如果 mBufferChannel 销毁了那么 ACodec 自然也就无法工作了。
之前看汽车和发动机的例子会有一些疑惑明明发送机可以独立存在为什么它和汽车还是组合关系呢应该是这么理解如果没有汽车也就没有发动机存在的必要了所以说是没有整体也就没有部分。
组合关系比聚合关系更加强烈所以用的是黑色箭头。
在代码中聚合关系 和 组合关系通常以成员变量体现出来具体属于哪一种还需要自己揣摩。
3.5、关联关系
个人理解关联关系表示的是拥有比如说学生拥有自行车那么学生就和自行车有了关联。
在代码中关联关系同样是以成员变量体现出来但是属于拥有的关系和上面的组合与聚合不一样并不需要自行车才能够组成一个人。
3.6、依赖关系
依赖关系表示的是调用的关系它是一种临时性关系在代码中体现为参数传入。再举个例子学生每天骑共享单车上学车不属于学生但是学生每天需要使用自行车这就属于依赖关系。如果学生有了车那么可能就要归类于关联关系了。
好了以上就是我对 UML 图绘制以及类之间关系的个人理解如果有误欢迎指出~