﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-eric-随笔分类-UML</title><link>http://www.blogjava.net/jjshcc/category/46279.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Sep 2010 02:58:36 GMT</lastBuildDate><pubDate>Thu, 09 Sep 2010 02:58:36 GMT</pubDate><ttl>60</ttl><item><title>UML中几种类间关系：继承、实现、依赖、关联、聚合、组合的联系与区别</title><link>http://www.blogjava.net/jjshcc/archive/2010/09/09/331472.html</link><dc:creator>Eric_jiang</dc:creator><author>Eric_jiang</author><pubDate>Thu, 09 Sep 2010 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/jjshcc/archive/2010/09/09/331472.html</guid><wfw:comment>http://www.blogjava.net/jjshcc/comments/331472.html</wfw:comment><comments>http://www.blogjava.net/jjshcc/archive/2010/09/09/331472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjshcc/comments/commentRss/331472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjshcc/services/trackbacks/331472.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">这是一堂关于UML基础知识的补习课；现在我们做项目时间都太紧了，基本上都没有做过真正的Class级别的详细设计，更别提使用UML来实现规范建模了；本篇主要就以前自己一直感觉很迷糊的几种class之间的关系进行整理，让我们在真正用UML进行比如类图设计时能够更加清晰明了；以下就分别介绍这几种关系：</font></p>
<p><font style="background-color: #cce8cf">继承<br />
指的是一个类（称为子类、子接口）继承另外的一个类（称为父类、父接口）的功能，并可以增加它自己的新功能的能力，继承是类与类或者接口与接口之间最常见的关系；在Java中此类关系通过关键字extends明确标识，在设计时一般没有争议性；<img border="0" alt="" align="left" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/Generalization.jpg" width="293" height="204" /></p>
<p><br />
<br />
</font><font style="background-color: #cce8cf"><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
实现<br />
指的是一个class类实现interface接口（可以是多个）的功能；实现是类与接口之间最常见的关系；在Java中此类关系通过关键字implements明确标识，在设计时一般没有争议性； </p>
<p>&nbsp;</p>
<p><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/Realization.jpg" width="121" height="203" /><br />
依赖<br />
可以简单的理解，就是一个类A使用到了另一个类B，而这种使用关系是具有偶然性的、临时性的、非常弱的，但是B类的变化会影响到A；比如某人要过河，需要借用一条船，此时人与船之间的关系就是依赖；<span style="color: red">表现在代码层面，为类B作为参数被类A在某个method方法中使用</span>；</p>
<p><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/Dependence.jpg" width="430" height="97" /><br />
关联<br />
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系，比如我和我的朋友；这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的，一般是长期性的，而且双方的关系一般是平等的、关联可以是单向、双向的；<span style="color: red">表现在代码层面，为被关联类B以类属性的形式出现在关联类A中，也可能是关联类A引用了一个类型为被关联类B的全局变量</span>；</p>
<p><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/Association.jpg" width="430" height="105" /><br />
聚合<br />
聚合是关联关系的一种特例，他体现的是整体与部分、拥有的关系，<span style="color: red">即has-a的关系</span>，<span style="color: red">此时整体与部分之间是可分离的</span>，<span style="color: red">他们可以具有各自的生命周期</span>，<span style="color: red">部分可以属于多个整体对象，也可以为多个整体对象共享；比如计算机与CPU、公司与员工的关系等；表现在代码层面，和关联关系是一致的，只能从语义级别来区分</span>；</p>
<p><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/Aggregation.jpg" width="430" height="108" /><br />
组合<br />
组合也是关联关系的一种特例，他体现的是一种<span style="color: red">contains-a的关系</span>，这种关系比聚合更强，也称为强聚合；他同样体现整体与部分间的关系，但此时整体与部分是不可分的，<span style="color: red">整体的生命周期结束也就意味着部分的生命周期结</span>束；比如你和你的大脑；<span style="color: red">表现在代码层面，和关联关系是一致的，只能从语义级别来区分</span>；</p>
<p><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/Composition.jpg" width="430" height="106" /><br />
对于继承、实现这两种关系没多少疑问，他们体现的是一种类与类、或者类与接口间的纵向关系；其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系，是比较难区分的，有很多事物间的关系要想准备定位是很难的，前面也提到，这几种关系都是语义级别的，所以从代码层面并不能完全区分各种关系；但总的来说，后几种关系所表现的强弱程度依次为：组合&gt;聚合&gt;关联&gt;依赖；</p>
<p><font style="background-color: #cce8cf"><span style="color: red"><font style="background-color: #cce8cf">关联和依赖区别是什么</font></span>：</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font style="background-color: #cce8cf">对类而言依赖存在的理由有：B作为一个参数被传递给A众所定义的一个方法(参数可见性)；B在A的一个方法众被声明未局部对象(局部声明可见性)；B对A全局可见(全局可见性)而关联一般应来描述普通的属性可见性(B是A的一个属性，是一种相对长久的可见性,是普遍存在的)<br />
</p>
<p><font style="background-color: #cce8cf">依赖是比关联弱的关系，关联代表一种结构化的关系，体现在生成的代码中，以java为例：&nbsp;&nbsp; <br />
&nbsp; 若类A单向关联指向类B，则在类A中存在一个属性B&nbsp;&nbsp; b。&nbsp;&nbsp; <br />
&nbsp; 若类A依赖类B，则不会有这个属性，类B的实例可能存在于某个方法调用的参数中，或某个方法的局部变量中。</font></p>
<p><font style="background-color: #cce8cf">例如代码：<br />
<span style="color: red">依赖：----存在于某个方法调用的参数中，或某个方法的局部变量中。</span></font></p>
<p><font style="background-color: #cce8cf">Person类与Screwdriver类的依赖关系<br />
public class Person{&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /** 拧螺丝 */&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void screw(Screwdriver screwdriver){&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; screwdriver.screw();&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
}&nbsp;&nbsp; </font></p>
<p><font style="background-color: #cce8cf"><span style="color: red"><font style="background-color: #cce8cf">关联：---存在一个属性</font></span><br />
公司（Company）和员工(Employee)的关联关系<br />
public class Company{&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private Employee employee;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Employee getEmployee(){&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return employee;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void setEmployee(Employee employee){&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.employee=employee;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; //公司运作&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void run(){&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; employee.startWorking();&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
}&nbsp;&nbsp; </font></p>
<p><font style="background-color: #cce8cf"></font>组合和聚合的区别<br />
</p>
<p><font style="background-color: #cce8cf">组合：<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/776bfa092eca9f98d1581b06.jpg" width="232" height="48" /><br />
组合（也有人称为包容）：一般是实心菱形加实线箭头表示，如上图所示，表示的是C8被C7包容，而且C8不能离开C7而独立存在。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;但这是视问题域而定的，例如在关心汽车的领域里，轮胎是一定要组合在汽车类中的，因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里，就算轮胎离开了汽车，它也是有意义的，这就可以用聚合了。</font></p>
<p><font style="background-color: #cce8cf">在《敏捷开发》中还说到，A组合B，则A需要知道B的生存周期，即可能A负责生成或者释放B，或者A通过某种途径知道B的生成和释放。</font></p>
<p><font style="background-color: #cce8cf">代码：</font></p>
<p><font style="background-color: #cce8cf">class C7 {<br />
&nbsp;&nbsp;&nbsp; C8 theC8 ;<br />
} ;</font></p>
<p><font style="background-color: #cce8cf">class C8 {<br />
&nbsp;&nbsp;&nbsp; <br />
} ;<br />
<br />
</font></p>
<p><font style="background-color: #cce8cf">聚合：<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/jjshcc/技术截图/c5976d233ae393489822ed06.jpg" width="232" height="48" /></font></p>
<p><font style="background-color: #cce8cf">表示C9聚合C10，但是C10可以离开C9而独立存在（独立存在的意思是在某个应用的问题域中这个类的存在有意义。）。</font></p>
<p><font style="background-color: #cce8cf">class C9 {<br />
&nbsp;&nbsp;&nbsp; C10 theC10 ;<br />
} ;</font></p>
<p><font style="background-color: #cce8cf">class C10 {</font></p>
<p><font style="background-color: #cce8cf">} ;</font></p>
<p><font style="background-color: #cce8cf">可以看到，<span style="color: red">代码和聚合是一样的。具体如何区别，可能就只能用语义来区分了。<br />
</span></font></p>
<p>&nbsp;</p>
<p><br />
</font></font></p>
<img src ="http://www.blogjava.net/jjshcc/aggbug/331472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjshcc/" target="_blank">Eric_jiang</a> 2010-09-09 10:31 <a href="http://www.blogjava.net/jjshcc/archive/2010/09/09/331472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>