网站的动画效果代码,seo工具优化软件,深圳做网站推广的公司哪家好,怎么建个私人网站1、前言
从这一节开始#xff0c;我们将一起学习设计模式。我们的学习目标是什么呢#xff1f;
了解常用设计模式以及它们的使用场景#xff1b;分析实际工程中设计模式的使用#xff0c;揣摩实际意图#xff0c;了解作者设计思路#xff1b;尝试运用设计模式迭代、重构…1、前言
从这一节开始我们将一起学习设计模式。我们的学习目标是什么呢
了解常用设计模式以及它们的使用场景分析实际工程中设计模式的使用揣摩实际意图了解作者设计思路尝试运用设计模式迭代、重构自己的代码提升软件架构设计思路。
最近在阅读 Android 源码时常碰到代码中有一些巧妙的写法简单的如 MediaPlayerService 中的 IFactory我知道它是工厂模式但是却不十分清楚它为什么这么用复杂点的如 NuPlayer 中的 DeferredActions 机制我只能慢慢揣摩它是如何工作的最终也能琢磨出个大差不差有些特点不太鲜明的如 NuPlayer Source 中的 wrapper我就不是很理解它为什么要这么写了。
学习一些优秀的工程源码实现时常常因为不理解其中这些设计的思路觉得作者写的晦涩难懂有的时候猛然揣摩出作者的用意又觉得豁然开朗。很多时候即使我们知道了一些设计或者写法但是并不一定能够灵活运用为了让初学者能够写出更优秀的代码前人整理整理出了写作过程中常用的技巧和设计模式深入学习和思考设计模式无论是对代码阅读还是写作都是大有裨益的。
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 图绘制以及类之间关系的个人理解如果有误欢迎指出~