检查同学们的制作的UML图时,同学们提出了很多的疑问, 其中问题最多的是时序图部分。

    开始大家都是采用工厂创建接口,业务逻辑层调用接口层,接口再调用实现类的顺序来画图。

    后来想了想,接口层与接口的实现层没有调用关系。在时序图中不应该体现接口对实现的调用。既然没有调用关系,那么画图时,业务逻辑层是调用到接口呢,还是去调用接口的实现呢。

    这个问题我也不清楚,于是开始参考VS2010生成的时序图,但是每个人生成的图也不相同。有的图是调用接口,接口以后的时序图是没有的。有的图则是调用的接口的实现。   

    自己写了一个小Demo,模拟各层之间的调用,发现生成图不同的原因,在于上一层对下一层的引用位置。

    举个例子来说,我们现在有如下几个类,Form1 窗体类,Bll类,IDal(接口)类,Dal(接口实现)类,SqlHelper类

这些类分别模拟了各层之间的调用关系,调用关系为Form1—>Bll.Add()—>Idal<—Dal—>SqlHelper

    Bll类中有一个Add()方法,为方便描述,其余几个类分别有一个Add()方法。

    如果Bll类这样调用IDal接口

public class Bll
    {

       //引用在类体中
       IDal dal = new Dal();      
       public string Add()
       {    
           
          return dal.Add();          
       }
    }

    生成的图如下:

  这时候Bll类与IDal(接口)类是关联关系,生成的时序图到IDal类就结束了。

 

   如果Bll类这样调用IDal接口

public class Bll
    {            
       public string Add()
       {

         //引用在方法中
          IDal dal = new Dal();
          return dal.Add();          
       }
    }

生成的图如下:

  这时候Bll类与IDal(接口)类是依赖关系,Bll 类会调到接口的实现类Dal 上  

    总结:不同的设计带来不同的系统实现。在画图时,如果有接口和接口的实现,推荐在时序图中用接口的实现来描述方法的调用。这样实现类后面一系列方法的调用,均可以通过时序图反应出来。

   个人见解,欢迎留言斧正。