目录
![](https://img.haomeiwen.com/i2484454/ac0efd031ef6fe99.png)
一、建模与图形思考
在项目正式 Coding 之前,架构师(Architect)的工作主要有两个方面:创意设计
和人际沟通
。如何去完成这两部分内容呢?答案就是:UML 图。
![](https://img.haomeiwen.com/i2484454/5f227544a642a8f9.png)
借助 UML 图形,架构师可以对整个项目的架构或者框架进行创意设计。通过图形建模将内含的基本概念和关系表达出来。在沟通的时候也可以通过 UML 图形,让不懂代码的人也能够理解整体的设计,减少沟通的成本。
所以,对于架构师来说,其图形绘制能力和思考能力越好,其创意设计与人际沟通能力就越好。
二、UML建模工具
Astah Professional:Astah Professional(原名JUDE)是UML建模工具中,最具有简洁设计、轻便简单、易学好用的。Astah 功能强大,支持UML2.x中的图表(Diagram),包括:
- Class Diagram(类别图)
- Use Case Diagram(用例图)
- Statemachine Diagram(状态机图)
- Sequence Diagram(顺序图)
- Activity Diagram(活动图)
- Communication Diagram(通信图)
- Component Diagram(模块图)
- Deployment Diagram(布署图)
- Composite Structure Diagram(组合结构图)
官方网站:http://astah.net/
可以下载一个免费小区型(Community)版本来使用。
三、绘制UML类别图:表达<基类/子类>
下载安装好 Astah 后,我们来尝试画一下类别图,看看在类别图中,如何表达基类、子类的关系。
-
step1:启动 Astah ,在菜单栏中选择
<Diagram>
,在出现的下拉框中选择Class Diagram
;
![](https://img.haomeiwen.com/i2484454/074b07895894357c.jpg)
选择后,界面会出现一个空白的类别图,我们将在上面绘制我们需要的 Class。
![](https://img.haomeiwen.com/i2484454/8533a9d2458f854d.jpg)
在空白的类别图上方,有一排类别图的元素(Element),简称「图素」,如下:
![](https://img.haomeiwen.com/i2484454/653472e34e304a07.jpg)
- step2:在元素列表中,我们选中第二个图素,然后移动鼠标到图表里面,按下鼠标左键,就会在图标中出现一个类别元素;
![](https://img.haomeiwen.com/i2484454/c4dac3f3864bfe6f.jpg)
![](https://img.haomeiwen.com/i2484454/9381d3aa01eba2a2.jpg)
假设这个类别元素是 Android 里面的 Activity 。
![](https://img.haomeiwen.com/i2484454/e986c09a3e0a89ee.jpg)
tips:如果想要修改类别元素的背景颜色。可以右键,选中Set Color
,然后选择自己喜欢的颜色就行。
![](https://img.haomeiwen.com/i2484454/89113186e4fb707b.jpg)
让我们再画一个类别元素,名叫MyActivity
:
![](https://img.haomeiwen.com/i2484454/de70d86579b32f55.jpg)
-
step3:建立 Activity 和 MyActivity 之间的继承关系。在元素列表中,选中
Generalization
,然后将鼠标移动到 MyActivity 上,点击左键,再将鼠标移动到 Activity上,点击左键,即可完成;
![](https://img.haomeiwen.com/i2484454/8fd9b879e9da1850.jpg)
![](https://img.haomeiwen.com/i2484454/b1a6fe96193d62fd.jpg)
四、绘制UML类别图:表达接口(Interface)
对于架构师而言,接口(Interface)
的角色比类(Class)
来得重要多了。在上一小节中,我们学些了继承(extends)
关系的表达,在这一小节,我们来学习一下实现(implements)
关系如何表示。
我们以 Activity 实现 OnClickListener 接口为例:
public class MyActivity extends Activity implements OnClickListener {
......
}
-
step1:在元素列表中选中接口图素,然后移动鼠标到类别图的空白位置,点击鼠标左键创建一个接口元素,取名叫
OnClickListener
;
![](https://img.haomeiwen.com/i2484454/fa77d09ea71f8d75.jpg)
![](https://img.haomeiwen.com/i2484454/9e0920fdc6e7bff7.jpg)
-
step2:为 OnClickListener 接口创建一个
注释 <Note>
;
![](https://img.haomeiwen.com/i2484454/e1098f8e378892b6.jpg)
在<Note>里面声明一下接口中的抽象方法:
![](https://img.haomeiwen.com/i2484454/8ba84cd5a96a6864.jpg)
-
step3:选中
<NoteAnchor>
图素将注释和接口连接起来;
![](https://img.haomeiwen.com/i2484454/d8b35dcc6c1110f9.jpg)
![](https://img.haomeiwen.com/i2484454/e698826822f7fb97.jpg)
-
step4:表达 Class 与接口之间的关系。选中
<Association>图素
,将 MyActivity 和 OnClickListener 连接起来;
![](https://img.haomeiwen.com/i2484454/a5d8b26333cdb1ca.jpg)
![](https://img.haomeiwen.com/i2484454/85da609c5207fbf7.jpg)
在 MyActivity 中声明一下实现的 onClick 方法:
![](https://img.haomeiwen.com/i2484454/db9dd8cd13973a76.jpg)
![](https://img.haomeiwen.com/i2484454/f89e2f10098a8ec6.jpg)
当 MyActivity 实现了 OnClickListener 接口以后,其它类就能通过此接口来调用 MyActivity 里的 onClick() 函数:
public class MyActivity extends Activity {
@Override public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Button btn = new Button(this);
btn.setText("OK");
btn.setBackgroundResource(R.drawable.heart);
btn.setOnClickListener(this);
setContentView(button);
}
上述代码表示了页面中有一个 Button,该 Button 调用了 onClick 方法:
![](https://img.haomeiwen.com/i2484454/2e84f971aae6e06b.jpg)
那么 onClick 方法调用的顺序是怎样的呢?下面,我们来画一画。
首先,选中<Association>图素
,将 Button 和 OnClickListener 接口连接起来,注意连线的时候,是从 Button 到 OnClickListener :
![](https://img.haomeiwen.com/i2484454/e4e05b87e28d9a6d.jpg)
然后在连接线处点击右键,选择Navigation -> Navigable
。然后我们就可以看到,原来的直线已经带上了箭头,箭头的方向指向被调用方。
![](https://img.haomeiwen.com/i2484454/1b26c6c1d96c42ce.jpg)
![](https://img.haomeiwen.com/i2484454/309f0aa86749cd94.jpg)
我们可以给线改成其他颜色,这样更加清晰:
![](https://img.haomeiwen.com/i2484454/41db0fc26f95907f.jpg)
OnClickListener 则会去调用 MyActivity 中的 onClick() 方法:
![](https://img.haomeiwen.com/i2484454/2902d2001a1aefd7.jpg)
我们可以在线上标记出方法名:右键,选项 Set Name
,填入 onClick():
![](https://img.haomeiwen.com/i2484454/78db474546b6278b.jpg)
![](https://img.haomeiwen.com/i2484454/8453e6bf1cafd0fa.jpg)
这样,我们就把实现关系,以及方法调用的顺序给描述清楚了。
网友评论