如何看UML图? UML能给我们带来什么? 这是本文要寻找的答案。UML图有很多类型,我们这里只讨论最重要也最常用的两种 - 类图和时序图。
通过类图,我们可以很容易的了解代码架构,理清模块之间的关系, 包括继承(Inheritance),实现(realization),依赖(dependency),组合(Composition), 聚合(Aggregation), 关联 (Association) 等等。
下面图中就图中给出的7种关系一一解读。
Compostion 是一种 Association 关系,但它更强调两个类之间的整体和局部关系,它暗示两个类之间有着相同的生命周期,比如说图中的三个1.
public final class ViewRootImpl implements ViewParent, View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks { ... final W mWindow; ... mWindow = new W(this); //互相引用,所以当一个销毁时,另外一个也无法存在。 }
Realization 就是实现,在Java中体现未 implements 一个接口类(interface), 在标准的C++中没有接口的概念,Realization 可以实际上是继承一个抽象类。在Android 的C++代码中,有一个特殊的接口类 IInterface, 它实际也是一个抽象类,但和Java的接口类含义是一样的。
有接口就会有引用,在UML中一根最普通的单向箭头即是引用(关联)关系。它的含义是,某个对象用到了一个不属于他的对象的接口或属性。通常,Assocation 通过两种方式获取
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();
和简单组合关系的对象相比,Associated对象的生命周期管理要复杂一些,因为他有可能被若干个对象所应用,如果不小心干掉一个还在使用的对象,就会造成不可知的后果。Java中通过GC完全去除了析构方法,而Android 在C++中引入的智能指针(会有专门文章介绍)来大大减轻开发者的负担。
C++和Java 的接口并没有定义接口调用是进程内的调用,还是跨进程的调用(IPC)。Android 对此专门做了一些特殊的规定。凡是IXXXX 定义的接口类均可以支持IPC(并不一定,进程间也可以调用IXXXX定义的接口,但大部分是)。当我们在图中看到一个IXXX 接口的调用和实现两端,我们可以假定这两端的对象分别运行在不同的进程里,至少是不同的线程。如下图中,W对象 和 WindowState 对象就用不同的颜色来标明它们分属于不同的进程,W运行在应用程序的进程里,而WinState存在与System Server 进程里。
聚合表达了两个类的从属关系,但和Composition不同,他们的生命周期并不一样。一个经典的例子就是工厂和车子,车子是工厂造出来的,工厂倒闭了,车子可以继续开,反之亦然。图中PolicyManager 和 PhoneWindow就是类似的关系。
就是最常见的继承关系了。复杂的继承关系很难阅读和记忆,通过UML图则方便很多,你可以清楚到看出继承关系,同时能够理解继承的设计思想。比如说图中右上角,PhoneWindow 继承了Window 类,Activity 引用的是基类window的对象,但背后是PhoneWindow对象, 因为Acitivy 用的 是PolicyManager构造出来的。通过这种方式,PhoneWindow的实现细节被PolicyManager 和 Window 基类隐藏起来,从而大大降低了应用程序(Activity) 改变的几率。这个正是设计模式里有名的工厂模式之一。
依赖不同与引用,依赖者和被依赖着之间没有直接的对象引用,通常是常量或静态方法的使用。比如图中,Activity使用了PolicyManager类的静态方法 makeNewWindow() 创建了PhoneWindow对象,我们说Acitivy 依赖PolicyManager 这个模块。依赖通常用一根单向虚线箭头表示。
通过时序图,我们可以了解代码的调用流程, 并可以检查调用过程中可能产成的潜在问题,如死锁等。