【UML】如何看Android的UML图

UML图有很多类型,这里只讨论最重要也最常用的两种 - 类图和时序图。

1. 类图

通过类图,我们可以很容易的了解代码架构,理清模块之间的关系,

包括继承(Inheritance),实现(realization),依赖(dependency),组合(Composition), 聚合(Aggregation), 关联 (Association) 等等。

下面就图中给出的7种关系一一解读。

1.1 Composition

Compostion 是一种 Association 关系,但它更强调两个类之间整体和局部关系,它暗示两个类之间有着相同的生命周期,

比如说图中的三个1.

  • W 是 ViewRootImpl的成员变量之一,ViewRootImpl 对象的构造函数里也构造了W,因此,当ViewRootImpl 析构时,W也被析构,他们的生命周期是一致的。

    public final class ViewRootImpl implements ViewParent,
            View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks {
      ...
      final W mWindow;
      ...
    
      mWindow = new W(this); //互相引用,所以当一个销毁时,另外一个也无法存在。
    
    }

  • 同样类似的关系存在于 WindowManagerService 和 WindwoState 之间。

1.2  Realization

Realization就是实现,在Java中体现为implements 一个接口类interface, 在标准的C++中没有明确的接口概念,但抽象类实际上起着和接口类似的功能,因为C++的Realization可以体现为继承一个抽象类。在Android 的C++代码中,有一个特殊的抽象类IInterface, 定义了PC接口类的一些基本方法。

1.3  Association

有接口就会有引用,在UML中一根最普通的单向箭头即是引用(关联)关系。它的含义是,某个对象用到了一个其他对象的接口或属性。通常,Assocation 通过两种方式获取

  • 依赖注入,通过构造函数或SetXXX()接口,比如说 WindowState 通过构造时传入的参数获取了对IWindow对象的引用

    WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
               WindowState attachedWindow, int appOp, int seq, WindowManager.LayoutParams a,
               int viewVisibility, final DisplayContent displayContent)

  • 间接获取,通过调用其他对象方法返回。

    mActivityManager = ActivityManagerNative.getDefault();

1.4 Android 的 IPC interface.

C++和Java 的接口都只支持进程内的调用。为了支持专门用于跨进程的接口调用,Android 专门做了一些规定。

凡是以IXXXX 定义的接口类均可以支持IPC(当然,进程内也可以调用IXXXX定义的接口)。

当我们在图中看到一个IXXX 接口类,我们便可以认为这是一个进程的边界,他的实现端和调用端对象运行在不同的进程里(至少是不同的线程)。

如上图中,IWindow的两端W对象 和 WindowState 对象就用不同的颜色来标明它们分属于不同的进程,W运行在应用程序的进程里,而WinState存在与System Server 进程里。

1.5 Aggregation

聚合表达了两个类的从属关系,但和Composition不同,他们的生命周期并不一样。

一个经典的例子就是工厂和车子,车子是工厂造出来的,工厂倒闭了,车子可以继续开,反之亦然。

图中PolicyManager 和 PhoneWindow就是类似的关系。

1.6 Inherritance

就是最常见的继承关系了。

复杂的继承关系很难阅读和记忆,通过UML图则方便很多,你可以清楚到看出继承关系,同时能够理解继承的设计思想。

比如说图中右上角,PhoneWindow 继承了Window 类,Activity 引用的是其基类Window的对象,但背后真正干事的是PhoneWindow对象, 因为Acitivy 用的Window类对象是PolicyManager构造出来的。通过这种方式,PhoneWindow的实现细节被PolicyManager 和 Window 基类隐藏起来,从而大大降低了应用程序(Activity) 改变的几率。

这个正是设计模式里有名的工厂模式之一。

1.7  依赖

依赖不同于引用,依赖者和被依赖着之间没有直接的对象引用,通常是常量或静态方法的使用。

比如图中,Activity使用了PolicyManager类的静态方法 makeNewWindow() 创建了PhoneWindow对象,我们说Acitivy 依赖PolicyManager 这个模块,但它并没有引用PoclicyManager的对象。

依赖通常用一根单向虚线箭头表示。

2. 时序图

通过时序图,我们可以了解代码的调用流程, 并可以检查调用过程中可能产成的潜在问题,如死锁等。

时序图可以从两个方向去看,纵向和横向。

纵向描述了一个对象在时间轴上所做的事情,一个方块通过代表一个函数的调用。

横向则描述了各个对象之间的调用关系, 包括同步调用,异步调用,返回等等。

此外,在时序图中,我们可以给执行块赋予不同的颜色,代表了他们分别运行在不同的进程或线程里。

下面就是一张时序图的例子,它描述了Android中一个System server 进程启动的过程, 图中的粉红色注释列举了从图中我们可以获知的一些信息。

刚才不是说从时序图中能看出死锁? 就这样一样图?夸张了吧! 没错,看看下面一个例子吧!

这是一个很简单的例子,图中有两个线程,绿色是app线程,它通过调用MediaPlayer 对象的函数来控制播放器,这里它做了两件事,Start() 然后 Stop (). 而粉色部分代表Driver 线程,它通过回调函数告知Mediaplayer 一下底层的事件。也就是说Mediaplayer 是一个被两个线程同时引用的对象,是一个共享的资源。

想当然的,我们用了一把锁来保护它,防止他被同时使用产生冲突。所以,图中,绿色的app在Stop()时候首先拿到了锁。这时问题发生了,Stop()的过程可能会比较长,中途来了一个事件, 图中黄色注释的右方显示了这个情况,两个颜色的长条重叠在一起。这表明有资源冲突发生,也意味着潜在的死锁风险。我们假设Stop()的最终目的就是要析构VideoDecoder 对象,但此时,VideoDecoder调用的eventHandler() 在另外一个线程还没返回,理所当然的我们需要等待它。不幸的是,这个时候死锁发生了,如图中红色注释所示。

通过简单的画这么一个图,可以很轻易的分析出一个死锁的情况。那怎么解决它的,尽可以的避免图中不同颜色的条块重叠在一起。看看下面的解决方案


    这回,我们取消了锁的操作,通过添加一个新的线程(变成3个线程,3种颜色)Thread,将同步的调用变成异步,,交由Thread做后台处理。

因此图中不再有颜色块重叠(异步调用产生的重叠不算), Stop()和EventHandler都很快返回(异步调用), 从而消除了死锁的存在。

这也是为什么Andriod 设计了Looper, MessageQueue 和 Handler 的异步消息处理机制,并在Framework 中大量的使用,因为Android 是个极其复杂的多线程/多进程应用环境,基于锁的同步调用机制是难于保证完全避免死锁的发生。

这下同意了吧,时序图对分析多线程的编程分析有很大的帮助。我们应该在设计阶段尽可能的用类图和时序图来帮助我们避免一些常见的问题,帮助我们得出一个尽可能好的设计。

3.  怎样画Android UML 图?

工具!必须依赖工具,市面上有太多的UML工具,你只需要找一款支持逆向工程的,即将代码转换成UML的数据结构,然后将类图或时序图一步步的绘制出来。

参考文章

http://www.cnblogs.com/samchen2009/p/3315999.html

时间: 2024-08-03 02:26:36

【UML】如何看Android的UML图的相关文章

[转]解析UML建模语言中的UML图分类、 UML各种图形及作用

本文向大家介绍一下UML图分类,作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML图大致可分为五类,共有九种图形. AD: 本文和大家重点讨论一下UML图分类,标准建模语言UML的重要内容可以由下列五类图(共9种图形)来定义.请看下面详细介绍. UML图分类 -------------------------------------------------------------------------------- 作为一种建模语言,UML的定义包括UML语义和UML

UML建模学习4:UML基本构造块之图

今天继续来看UML基本构造块中的图. 一UML基本构造块之图 UML基本构造块的图是在特定的视角下对系统所作的抽象描述.图是事物集合的分类,UML中包含多种图.我们先来看分类: UML定义了5类,10种模型图 五种类图定义: 1用例图:从用户角度描述系统功能,并指各功能的操作者. 2静态图:包括类图,包图,对象图. 2.1类图:描述系统中类的静态结构. 2.2包图:是包和类组成的,表示包与包之间的关系,包图描述系统的分层结构. 2.3对象图:是类图的实例. 3行为图:描述系统动态模型和对象组成的

【UML】概念、关系、图(一)

最近在画UML图,在UML视频看完之后一直没有总结,是因为当时对UML的九种图还不是太理解,我想在画图过程中加深自己的理解,使我更上一层楼.现在感觉是时候了..这篇博客是泛泛地介绍一下UML,了解一下它的基本内容,达到深入浅出的效果! 什么是UML 1.可视化的面向对象建模语言 2.描述系统的静态结构和动态行为 3.用图形表现系统的整体结构 4.不同角度为系统建模,形成不同视图 UML的作用 在之前,我已经学过关于软件工程的博客.通过软件工程开发软件,会产生各种各样的文档,为软件的开发做好充分的

UML总结(对九种图的认识和如何使用Rational Rose 画图)

2013-01-23 11:05 24432人阅读 评论(31) 收藏 举报  分类: UML(6)  版权声明:本文为博主原创文章,未经博主允许不得转载. UML是一种建模语言,是系统建模的标准.我们之所以建模是因为大规模的系统设计时相当复杂的,当系统比较复杂时就会涉及到以下这几个问题: 开发人员如何与用户进行沟通来了解系统的需求? 开发人员之间如何沟通以确保各个部门能够无缝地协作? 而UML是我们在构造个特种模型时首选的一种建模工具,去描述系统的需求和设计,在对复杂的工程进行建模时,系统可由

UML视图(六)时序图

[定义] 时序图(Sequence Diagram),亦称为序列图或循序图,是一种UML行为图.它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作.它可以表示用例的行为顺序,当执行一个用例行为时,时序图中的每条消息对应了一个类操作或状态机中引起转换的触发事件. 时序图与协作图是可以互相转换的,与胁作图不同的是,时序图强调消息事件的发生顺序,更方便于阐述事件流的过程:但是时序图却难以表达对象之间关系. [元素]对象.生命周期线.消息.会话.销毁 对象 参与交互的对象.每个对象都带有一条

UML视图(五)活动图

[定义]活动图是UML的动态视图之一,用来描述事物或对象的活动变化流程. [基本元素]活动.活动流. 分支.分劈和汇合.泳道.对象流,六大基本元素.     活动 活动是活动图主要结点,用两边为弧的条形框表示,中间填写活动名. 活动分为简单活动和复合活动. 简单活动:不能在分解的活动. 复合活动:可以再分解的复杂活动.     活动流 活动流描述活动之间的有向关系,反映一个活动向另一个活动之间的转移.用带箭头的实线表示.     分支 分支表示活动流的分叉和合并.表示从一个活动按照某种条件转移到

UML学习(二)-----类图

UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs.com/yangfengming/archive/2008/08/14/1267495.html http://www.cnblogs.com/huangxincheng/archive/2012/10/17/2728736.html http://www.cnblogs.com/playing/

UML视图(三)包图

包图,跟类的作用很相似,同是把相关或某方面具有共同特征的信息房子一起分隔开来:不同的是,包的范围更大容量更广. 包能容纳UML中的任何元素,例用例.业务实体.包(子包)等.Rose画图软件中的Use Case View(用例视图).Logic View(逻辑视图)和Component View(组件视图)就是三个包. 包是一种容器,如同文件夹一样,它将某些信息分类,形成逻辑单元,使用包的目的是为了整合复杂的信息. 包这么亲和,那为了避免无意的滥用,造成混乱.对包的划分进行了一些约束,总结为一句话

<十四>UML核心视图静态视图之类图和包图

一:类图(行为类和实体类) --->类图用于展示系统中的类及其相互之间的关系 --->概念层类图 --->说明层类图 二:概念层类图 --->概念层的观点认为:在这个层次的类图描述的是现实世界中问题领域的概念理解. --->在概念层上,类图着重于对问题领域的概念化理解,而不是实现,因此类名称通常都是问题领域中实际事物的名称.就是处于概念阶段. --->比如:网上购物主要由商品,订单,支付卡这几个类构成. 三:说明层类图 --->说明层类图是搭建在现实世界和最终实现