uml时序图的存在
在上一篇中记录了uml类图,用类图来描述代码中所需要的类以及相互之间的关系,也就立体的将整个程序框架展现在了我们面前,像一幅画,有山有水有人。
一张照片只能定格当时的美好,等物是人非,再看时却往往不是欣喜,而是惆怅和失落,那些念念不忘的,终究还是跟着时间走了,哪怕依依不舍,也只能在回忆里沉醉。
如果说类图就是一张张照片,那回忆就是一幅幅时序图,走过,也可能错过,笑过,也可能哭过,可不论怎样,是我们让这个世界一点点改变,一点点动起来。
如果说类图是一张张曾经规划的图纸,那时序图就是记载那些梦想成真的纪实或者历史。
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();
}
}
这样整个这次交互是不是就很明白了呢。当然还存在异步消息、自关联消息以及特定条件消息等一些表示方法,我们是可以根据相同的理解进行推理,这里就不详细介绍了。
UML时序图的实例
在了解时序图的过程中,我曾在博客园中看到过一篇很不错的文章,也是让我弄明白时序图的开始,可惜的是当时我没有记录下网址来,现在再找反而找不到了,不过庆幸的是,当时曾经对他提出的问题截了图,还一直保存着,这里就传上来跟大家一起分析:
当时应该是作者说弄明白这三个图,时序图也就明白个差不多了,我信以为真就保存了下来,而事实证明,我反复看过一段时间之后,也真的是弄懂了些,难怪作者敢那么自信。
这三个图的不同之处,无非是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();
}
}
这样将三个都写出来,是不是就明白了很多
UML时序图的练习
其实在了解时序图的时候,我曾经得到过一幅神图,也是我理解时序图的最关键的一幅图,这里与大家一起共享下,看看不妨自己练习下哦:
准备离职了,一旦决定要做一件事,真的就很难在过去的状态中继续沉迷了,为自己加油吧,fighting....