图解Android_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 图解Android

图解Android

 2013/10/13 10:23:35  如何看Android的UML 图?  博客园  我要评论(0)
  • 摘要:如何看UML图?UML能给我们带来什么?这是本文要寻找的答案。UML图有很多类型,我们这里只讨论最重要也最常用的两种-类图和时序图。1.类图通过类图,我们可以很容易的了解代码架构,理清模块之间的关系,包括继承(Inheritance),实现(realization),依赖(dependency),组合(Composition),聚合(Aggregation),关联(Association)等等。下面图中就图中给出的7种关系一一解读。1
  • 标签:android

如何看UML图? 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++中没有接口的概念,Realization 可以实际上是继承一个抽象类。在Android 的C++代码中,有一个特殊的接口类 IInterface, 它实际也是一个抽象类,但和Java的接口类含义是一样的。

 

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();

和简单组合关系的对象相比,Associated对象的生命周期管理要复杂一些,因为他有可能被若干个对象所应用,如果不小心干掉一个还在使用的对象,就会造成不可知的后果。Java中通过GC完全去除了析构方法,而Android 在C++中引入的智能指针(会有专门文章介绍)来大大减轻开发者的负担。

1.4 Android 的 IPC interface.

      C++和Java 的接口并没有定义接口调用是进程内的调用,还是跨进程的调用(IPC)。Android 对此专门做了一些特殊的规定。凡是IXXXX 定义的接口类均可以支持IPC(并不一定,进程间也可以调用IXXXX定义的接口,但大部分是)。当我们在图中看到一个IXXX 接口的调用和实现两端,我们可以假定这两端的对象分别运行在不同的进程里,至少是不同的线程。如下图中,W对象 和 WindowState 对象就用不同的颜色来标明它们分属于不同的进程,W运行在应用程序的进程里,而WinState存在与System Server 进程里。

1.5 Aggregation

聚合表达了两个类的从属关系,但和Composition不同,他们的生命周期并不一样。一个经典的例子就是工厂和车子,车子是工厂造出来的,工厂倒闭了,车子可以继续开,反之亦然。图中PolicyManager 和 PhoneWindow就是类似的关系。

1.6 Inherritance

就是最常见的继承关系了。复杂的继承关系很难阅读和记忆,通过UML图则方便很多,你可以清楚到看出继承关系,同时能够理解继承的设计思想。比如说图中右上角,PhoneWindow 继承了Window 类,Activity 引用的是基类window的对象,但背后是PhoneWindow对象, 因为Acitivy 用的 是PolicyManager构造出来的。通过这种方式,PhoneWindow的实现细节被PolicyManager 和 Window 基类隐藏起来,从而大大降低了应用程序(Activity) 改变的几率。这个正是设计模式里有名的工厂模式之一。

1.7  依赖

依赖不同与引用,依赖者和被依赖着之间没有直接的对象引用,通常是常量或静态方法的使用。比如图中,Activity使用了PolicyManager类的静态方法 makeNewWindow() 创建了PhoneWindow对象,我们说Acitivy 依赖PolicyManager 这个模块。依赖通常用一根单向虚线箭头表示。

 

 

 

2. 时序图

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

 

 

 

 

 

 

 

 

发表评论
用户名: 匿名