设计模式(1) - UML类图

这篇具有很好参考价值的文章主要介绍了设计模式(1) - UML类图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

从这一节开始,我们将一起学习设计模式。我们的学习目标是什么呢?

  1. 了解常用设计模式以及它们的使用场景;
  2. 分析实际工程中设计模式的使用,揣摩实际意图,了解作者设计思路;
  3. 尝试运用设计模式迭代、重构自己的代码;
  4. 提升软件架构设计思路。

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

学习一些优秀的工程源码实现时,常常因为不理解其中这些设计的思路,觉得作者写的晦涩难懂;有的时候猛然揣摩出作者的用意,又觉得豁然开朗。很多时候即使我们知道了一些设计或者写法,但是并不一定能够灵活运用,为了让初学者能够写出更优秀的代码,前人整理整理出了写作过程中常用的技巧和设计模式,深入学习和思考设计模式,无论是对代码阅读还是写作都是大有裨益的。

2、UML 类图

庞大的工程往往具有相当多且复杂的类,阅读这些类时我们常常会用 UML 类图来展示复杂的类关系,以下是一个简单的 UML 类图示例:
设计模式(1) - 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 图绘制以及类之间关系的个人理解,如果有误欢迎指出~文章来源地址https://www.toymoban.com/news/detail-707002.html

到了这里,关于设计模式(1) - UML类图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(40)
  • Java设计模式之行为型-状态模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不

    2024年02月16日
    浏览(40)
  • Java设计模式之行为型-命令模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、点餐案例  五、总结 1、将一个请求封装为一个对象,使您可以用不同的请求对客户进行参数化。 2、对请求排队或记录请求日志,以及支持可撤销的操作。 3、将命令对象与执行命令的对象分离,

    2024年02月16日
    浏览(36)
  • Java设计模式之结构型-桥接模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、支付方式 4.2、支付渠道  五、总结 桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。 桥接模式的核心思想是把抽象(abstraction)与实现

    2024年02月13日
    浏览(46)
  • Java设计模式之创建型-单例模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、饿汉模式 4.2、懒汉模式(线程不安全) 4.3、懒汉模式(线程安全) 4.4、双重检索模式 4.5、静态内部类 4.6、枚举  五、总结 单例模式确保一个类只有一个实例,提供一个全局访问点。一般实现方式是把构造函

    2024年02月13日
    浏览(45)
  • Java设计模式之创建型-建造者模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计  四、案例分析 五、总结 建造者模式是一种创建型设计模式,它使我们将一个复杂对象的构建步骤分离出来,使得同样的构建过程可以创建不同的表示。该模式的目的是将构建复杂对象的过程抽象化,从而减少代码的重复和复杂

    2024年02月15日
    浏览(44)
  • Java设计模式之行为型-迭代器模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 迭代器模式是一种常用的设计模式,它主要用于遍历集合对象,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 举个简单的比喻,聚合对象像一个存放苹果的篮子,迭代

    2024年02月16日
    浏览(45)
  • Java设计模式之行为型-责任链模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、在Java中实现 4.2、在SpringBoot中实现  五、总结  责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。请求会被链上每个处理者处理,直到请求被处理完毕。该模式主要解决的是请求的发送者和

    2024年02月15日
    浏览(39)
  • Java设计模式之结构型-组合模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、菜单遍历  五、总结  组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。 角色 描述

    2024年02月16日
    浏览(50)
  • Java设计模式之行为型-访问者模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 访问者模式是一种对象行为型设计模式,它能够在不修改已有对象结构的前提下,为对象结构中的每个对象提供新的操作。 访问者模式的主要作用是把对元素对象的操作抽象出来封装到访问者类中,这样就

    2024年02月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包