积跬步,聚小流-------关于UML时序图

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....

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值