在上一篇中记录了uml类图,用类图来描述代码中所需要的类以及相互之间的关系,也就立体的将整个程序框架展现在了我们面前,像一幅画,有山有水有人。
一张照片只能定格当时的美好,等物是人非,再看时却往往不是欣喜,而是惆怅和失落,那些念念不忘的,终究还是跟着时间走了,哪怕依依不舍,也只能在回忆里沉醉。
如果说类图就是一张张照片,那回忆就是一幅幅时序图,走过,也可能错过,笑过,也可能哭过,可不论怎样,是我们让这个世界一点点改变,一点点动起来。
如果说类图是一张张曾经规划的图纸,那时序图就是记载那些梦想成真的纪实或者历史。
我们先来看一个例子:
这样我们就对时序图有了一个大体的了解,然后也发现了时序图中常用到的对象、生命线、激活期和消息等,是的,这里就不再是类了,而是对象,一个真正的实例了。
这种表示方式是最明了的,对象名:类名让我们很容易就知道了B myB=new B();然而它还有着两种其它的方式:直接用:“:类名”因为我们无需知道具体定义的对象名,而“对象名”我们倒不怎么建议,因为我们无法知道它的类究竟是哪个。
在这里我们需要注意的有三点:调用方法是谁的方法、生命线、激活期。
我之前最迷惑的地方是doTwo()这个方法难道是说A对象方法中调用了b对象?事实上是不是的,时序图因为是动作的交互,只有B中含有doTwo()方法了,A才能与B进行交互,如果A中存在方法调用B的话,那我们用类之间的关系中依赖关系不就可以实现了么。
另一点就是激活期,像B中的两段激活期是断开的,说明调用两个方法是没有关联的,是A中分别调用的,通常我们都在激活期的上端写方法调用,而在下端写返回信息或者不写。
而生命线的存在则是对象的存在,在不调用B的对象myB的时候B已经是存在的了,那结果应该是什么呢?我们不妨来写一下代码(当然这样的类名实在是让人发指,但简单嘛,哈哈):
public class B(){ public void doTwo(){}; public void doThree(){}; }
我们容易写出B类,那A类呢:
public class A(){ public B myB; public void doOne(){ myB=new B(); myB.doTwo(); myB.doThree(); }; }
因为时序图是从上到下的,我们很容易就看出这次交互的整个流程,既然已经存在了上面的两个类,要做的只有把进程启动起来了:
public class begin(){ public static void main(String[]args){ A a=new A(); a.doOne(); } }
这样整个这次交互是不是就很明白了呢。当然还存在异步消息、自关联消息以及特定条件消息等一些表示方法,我们是可以根据相同的理解进行推理,这里就不详细介绍了。
在了解时序图的过程中,我曾在博客园中看到过一篇很不错的文章,也是让我弄明白时序图的开始,可惜的是当时我没有记录下网址来,现在再找反而找不到了,不过庆幸的是,当时曾经对他提出的问题截了图,还一直保存着,这里就传上来跟大家一起分析:
当时应该是作者说弄明白这三个图,时序图也就明白个差不多了,我信以为真就保存了下来,而事实证明,我反复看过一段时间之后,也真的是弄懂了些,难怪作者敢那么自信。
这三个图的不同之处,无非是B部分的激活期不同,我们分别来写一下:
第一个:
public class C(){ public void t(){}; public void s(){}; } public class B(){ private C cc; public void m(){ cc=new C(); cc.t(); }; public void anotherMethod(){//这里没有显示类的名字,自己随便命名的 cc=new C(); cc.s(); } } public class A(){ public static void main(String[]args){ B bb=new B(); bb.m(); } }
第二个:
public class C(){ public void t(){}; public void s(){}; } public class B(){ private C cc; public void m(){ }; public void unkownMethod(){// cc=new C(); cc.t(); } public void anotherMethod(){//这里没有显示类的名字,自己随便命名的 cc=new C(); cc.s(); } } public class A(){ public static void main(String[]args){ B bb=new B(); bb.m(); } }
第三个:
public class C(){ public void t(){}; public void s(){}; } public class B(){ private C cc; public void m(){ cc=new C(); cc.t(); cc.s(); }; } public class A(){ public static void main(String[]args){ B bb=new B(); bb.m(); } }
这样将三个都写出来,是不是就明白了很多
其实在了解时序图的时候,我曾经得到过一幅神图,也是我理解时序图的最关键的一幅图,这里与大家一起共享下,看看不妨自己练习下哦:
准备离职了,一旦决定要做一件事,真的就很难在过去的状态中继续沉迷了,为自己加油吧,fighting....
原文地址:http://blog.csdn.net/marsmile_tbo/article/details/44803247