﻿<?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>C++博客-C++ Programmer's Cookbook-随笔分类-UML/XML</title><link>http://www.cppblog.com/mzty/category/249.html</link><description>&lt;br/&gt;  
&lt;br/&gt;
&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/02/19109.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{C++ 基础}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/08/13/29922.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{C++ 高级}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/04/16/22064.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{C#界面，C++核心算法}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "http://www.cppblog.com/mzty/archive/2007/03/04/19163.html"&gt;&lt;font size = 5 color ="#00FFFF"&gt;{设计模式}&lt;font/&gt;&lt;/a&gt;

&lt;a href = "
http://www.cppblog.com/mzty/archive/2007/03/04/19167.html"&gt;&lt;font size = 5 color ="#FF0000"&gt;{C#基础}&lt;font/&gt;&lt;/a&gt;





</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 01:20:01 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 01:20:01 GMT</pubDate><ttl>60</ttl><item><title>UML类图关系</title><link>http://www.cppblog.com/mzty/archive/2008/04/16/47264.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Wed, 16 Apr 2008 09:09:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2008/04/16/47264.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/47264.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2008/04/16/47264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/47264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/47264.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">本文随便转载，请保留出处：<a href="http://blog.csdn.net/dylgsy/">http://blog.csdn.net/dylgsy/</a></p>
<p style="FONT-SIZE: 12pt">UML的类图关系分为：&nbsp;关联、聚合/组合、依赖、泛化（继承）。而其中关联又分为双向关联、单向关联、自身关联；下面就让我们一起来看看这些关系究竟是什么，以及它们的区别在哪里。<br><br>1、关联<br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_11.jpg" width=232 border=0><br><br>双向关联：<br>C1-C2：指双方都知道对方的存在，都可以调用对方的公共属性和方法。<br><br>在GOF的设计模式书上是这样描述的：虽然在分析阶段这种关系是适用的，但我们觉得它对于描述设计模式内的类关系来说显得太抽象了，因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的，更适合表达我们所讨论的那种关系。所以这种关系在设计的时候比较少用到，关联一般都是有向的。<br><br>使用ROSE 生成的代码是这样的：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C1&nbsp;<br><img id=_10_33_Open_Image onclick="this.style.display='none'; document.getElementById('_10_33_Open_Text').style.display='none'; document.getElementById('_10_33_Closed_Image').style.display='inline'; document.getElementById('_10_33_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_33_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_33_Closed_Text').style.display='none'; document.getElementById('_10_33_Open_Image').style.display='inline'; document.getElementById('_10_33_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C2*&nbsp;theC2;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C2&nbsp;<br><img id=_47_70_Open_Image onclick="this.style.display='none'; document.getElementById('_47_70_Open_Text').style.display='none'; document.getElementById('_47_70_Closed_Image').style.display='inline'; document.getElementById('_47_70_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_47_70_Closed_Image onclick="this.style.display='none'; document.getElementById('_47_70_Closed_Text').style.display='none'; document.getElementById('_47_70_Open_Image').style.display='inline'; document.getElementById('_47_70_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C1*&nbsp;theC1;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">双向关联在代码的表现为双方都拥有对方的一个指针，当然也可以是引用或者是值。<br><br><br><br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_12.jpg" width=232 border=0><br><br>单向关联:<br>C3-&gt;C4：表示相识关系，指C3知道C4，C3可以调用C4的公共属性和方法。没有生命期的依赖。一般是表示为一种引用。<br><br>生成代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C3&nbsp;<br><img id=_10_33_Open_Image onclick="this.style.display='none'; document.getElementById('_10_33_Open_Text').style.display='none'; document.getElementById('_10_33_Closed_Image').style.display='inline'; document.getElementById('_10_33_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_33_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_33_Closed_Text').style.display='none'; document.getElementById('_10_33_Open_Image').style.display='inline'; document.getElementById('_10_33_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C4*&nbsp;theC4;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C4&nbsp;<br><img id=_47_50_Open_Image onclick="this.style.display='none'; document.getElementById('_47_50_Open_Text').style.display='none'; document.getElementById('_47_50_Closed_Image').style.display='inline'; document.getElementById('_47_50_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_47_50_Closed_Image onclick="this.style.display='none'; document.getElementById('_47_50_Closed_Text').style.display='none'; document.getElementById('_47_50_Open_Image').style.display='inline'; document.getElementById('_47_50_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">单向关联的代码就表现为C3有C4的指针，而C4对C3一无所知。<br><br><br></p>
<p style="FONT-SIZE: 12pt"><img height=120 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_13.jpg" width=136 border=0><br><br>自身关联（反身关联）：<br>自己引用自己，带着一个自己的引用。<br><br>代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C14&nbsp;<br><img id=_11_36_Open_Image onclick="this.style.display='none'; document.getElementById('_11_36_Open_Text').style.display='none'; document.getElementById('_11_36_Closed_Image').style.display='inline'; document.getElementById('_11_36_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_11_36_Closed_Image onclick="this.style.display='none'; document.getElementById('_11_36_Closed_Text').style.display='none'; document.getElementById('_11_36_Open_Image').style.display='inline'; document.getElementById('_11_36_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C14*&nbsp;theC14;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">就是在自己的内部有着一个自身的引用。<br><br>2、聚合/组合<br><br>当类之间有整体-部分关系的时候，我们就可以使用组合或者聚合。<br><br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_21.jpg" width=232 border=0><br><br>聚合：表示C9聚合C10，但是C10可以离开C9而独立存在（独立存在的意思是在某个应用的问题域中这个类的存在有意义。这句话怎么解，请看下面组合里的解释）。<br><br>代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C9&nbsp;<br><img id=_10_34_Open_Image onclick="this.style.display='none'; document.getElementById('_10_34_Open_Text').style.display='none'; document.getElementById('_10_34_Closed_Image').style.display='inline'; document.getElementById('_10_34_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_34_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_34_Closed_Text').style.display='none'; document.getElementById('_10_34_Open_Image').style.display='inline'; document.getElementById('_10_34_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C10&nbsp;theC10;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C10&nbsp;<br><img id=_49_52_Open_Image onclick="this.style.display='none'; document.getElementById('_49_52_Open_Text').style.display='none'; document.getElementById('_49_52_Closed_Image').style.display='inline'; document.getElementById('_49_52_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_49_52_Closed_Image onclick="this.style.display='none'; document.getElementById('_49_52_Closed_Text').style.display='none'; document.getElementById('_49_52_Open_Image').style.display='inline'; document.getElementById('_49_52_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></div>
</div>
<p style="FONT-SIZE: 12pt">&nbsp;</p>
<p style="FONT-SIZE: 12pt"><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_22.jpg" width=232 border=0><br><br>组合（也有人称为包容）：一般是实心菱形加实线箭头表示，如上图所示，表示的是C8被C7包容，而且C8不能离开C7而独立存在。但这是视问题域而定的，例如在关心汽车的领域里，轮胎是一定要组合在汽车类中的，因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里，就算轮胎离开了汽车，它也是有意义的，这就可以用聚合了。在《敏捷开发》中还说到，A组合B，则A需要知道B的生存周期，即可能A负责生成或者释放B，或者A通过某种途径知道B的生成和释放。<br><br>他们的代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C7&nbsp;<br><img id=_10_32_Open_Image onclick="this.style.display='none'; document.getElementById('_10_32_Open_Text').style.display='none'; document.getElementById('_10_32_Closed_Image').style.display='inline'; document.getElementById('_10_32_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_10_32_Closed_Image onclick="this.style.display='none'; document.getElementById('_10_32_Closed_Text').style.display='none'; document.getElementById('_10_32_Open_Image').style.display='inline'; document.getElementById('_10_32_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public:<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C8&nbsp;theC8;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C8&nbsp;<br><img id=_46_48_Open_Image onclick="this.style.display='none'; document.getElementById('_46_48_Open_Text').style.display='none'; document.getElementById('_46_48_Closed_Image').style.display='inline'; document.getElementById('_46_48_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_46_48_Closed_Image onclick="this.style.display='none'; document.getElementById('_46_48_Closed_Text').style.display='none'; document.getElementById('_46_48_Open_Image').style.display='inline'; document.getElementById('_46_48_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt">可以看到，代码和聚合是一样的。具体如何区别，可能就只能用语义来区分了。<br><br>3、依赖<br><br><img height=48 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_31.jpg" width=232 border=0><br><br>依赖:<br>指C5可能要用到C6的一些方法，也可以这样说，要完成C5里的所有功能，一定要有C6的方法协助才行。C5依赖于C6的定义，一般是在C5类的头文件中包含了C6的头文件。ROSE对依赖关系不产生属性。<br><br>注意，要避免双向依赖。一般来说，不应该存在双向依赖。<br><br>ROSE生成的代码如下：<br></p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>//&nbsp;C5.h<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"C6.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C5&nbsp;<br><img id=_35_38_Open_Image onclick="this.style.display='none'; document.getElementById('_35_38_Open_Text').style.display='none'; document.getElementById('_35_38_Closed_Image').style.display='inline'; document.getElementById('_35_38_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_35_38_Closed_Image onclick="this.style.display='none'; document.getElementById('_35_38_Closed_Text').style.display='none'; document.getElementById('_35_38_Open_Image').style.display='inline'; document.getElementById('_35_38_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>//&nbsp;C6.h<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"C5.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C6<br><img id=_76_79_Open_Image onclick="this.style.display='none'; document.getElementById('_76_79_Open_Text').style.display='none'; document.getElementById('_76_79_Closed_Image').style.display='inline'; document.getElementById('_76_79_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_76_79_Closed_Image onclick="this.style.display='none'; document.getElementById('_76_79_Closed_Text').style.display='none'; document.getElementById('_76_79_Open_Image').style.display='inline'; document.getElementById('_76_79_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></div>
</div>
<p style="FONT-SIZE: 12pt">虽然ROSE不生成属性，但在形式上一般是A中的某个方法把B的对象作为参数使用(假设A依赖于B)。如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"B.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;A<br><img id=_23_52_Open_Image onclick="this.style.display='none'; document.getElementById('_23_52_Open_Text').style.display='none'; document.getElementById('_23_52_Closed_Image').style.display='inline'; document.getElementById('_23_52_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_23_52_Closed_Image onclick="this.style.display='none'; document.getElementById('_23_52_Closed_Text').style.display='none'; document.getElementById('_23_52_Open_Image').style.display='inline'; document.getElementById('_23_52_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;Func(B&nbsp;&amp;b);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</div>
</div>
<p style="FONT-SIZE: 12pt">那依赖和聚合\组合、关联等有什么不同呢？<br><br>关联是类之间的一种关系，例如老师教学生，老公和老婆，水壶装水等就是一种关系。这种关系是非常明显的，在问题领域中通过分析直接就能得出。<br><br>依赖是一种弱关联，只要一个类用到另一个类，但是和另一个类的关系不是太明显的时候（可以说是&#8220;uses&#8221;了那个类），就可以把这种关系看成是依赖，依赖也可说是一种偶然的关系，而不是必然的关系，就是&#8220;我在某个方法中偶然用到了它，但在现实中我和它并没多大关系&#8221;。例如我和锤子，我和锤子本来是没关系的，但在有一次要钉钉子的时候，我用到了它，这就是一种依赖，依赖锤子完成钉钉子这件事情。</p>
<p style="FONT-SIZE: 12pt">组合是一种整体-部分的关系，在问题域中这种关系很明显，直接分析就可以得出的。例如轮胎是车的一部分，树叶是树的一部分，手脚是身体的一部分这种的关系，非常明显的整体-部分关系。<br><br>上述的几种关系（关联、聚合/组合、依赖）在代码中可能以指针、引用、值等的方式在另一个类中出现，不拘于形式，但在逻辑上他们就有以上的区别。<br><br>这里还要说明一下，所谓的这些关系只是在某个问题域才有效，离开了这个问题域，可能这些关系就不成立了，例如可能在某个问题域中，我是一个木匠，需要拿着锤子去干活，可能整个问题的描述就是我拿着锤子怎么钉桌子，钉椅子，钉柜子；既然整个问题就是描述这个，我和锤子就不仅是偶然的依赖关系了，我和锤子的关系变得非常的紧密，可能就上升为组合关系（让我突然想起武侠小说的剑不离身，剑亡人亡...）。这个例子可能有点荒谬，但也是为了说明一个道理，就是关系和类一样，它们都是在一个问题领域中才成立的，离开了这个问题域，他们可能就不复存在了。<br><br><br>4、泛化（继承）<br><br><img height=128 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_41.jpg" width=72 border=0><br><br>泛化关系：如果两个类存在泛化的关系时就使用，例如父和子，动物和老虎，植物和花等。<br>ROSE生成的代码很简单，如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>#include&nbsp;"C11.h"<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C12&nbsp;:&nbsp;public&nbsp;C11<br><img id=_41_43_Open_Image onclick="this.style.display='none'; document.getElementById('_41_43_Open_Text').style.display='none'; document.getElementById('_41_43_Closed_Image').style.display='inline'; document.getElementById('_41_43_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_41_43_Closed_Image onclick="this.style.display='none'; document.getElementById('_41_43_Closed_Text').style.display='none'; document.getElementById('_41_43_Open_Image').style.display='inline'; document.getElementById('_41_43_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};</div>
</div>
<p style="FONT-SIZE: 12pt"><br>5、这里顺便提一下模板<br><br><img height=72 alt="" src="http://www.cppblog.com/images/cppblog_com/mzty/713/o_51.jpg" width=87 border=0><br><br>上面的图对应的代码如下：</p>
<div style="FONT-SIZE: 12pt">
<div style="FONT-SIZE: 12pt"><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>template&lt;int&gt;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>class&nbsp;C13&nbsp;<br><img id=_25_27_Open_Image onclick="this.style.display='none'; document.getElementById('_25_27_Open_Text').style.display='none'; document.getElementById('_25_27_Closed_Image').style.display='inline'; document.getElementById('_25_27_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_25_27_Closed_Image onclick="this.style.display='none'; document.getElementById('_25_27_Closed_Text').style.display='none'; document.getElementById('_25_27_Open_Image').style.display='inline'; document.getElementById('_25_27_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>};<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></div>
</div>
<p style="FONT-SIZE: 12pt">这里再说一下重复度，其实看完了上面的描述之后，我们应该清楚了各个关系间的关系以及具体对应到代码是怎么样的，所谓的重复度，也只不过是上面的扩展，例如A和B有着&#8220;1对多&#8221;的重复度，那在A中就有一个列表，保存着B对象的N个引用，就是这样而已。<br><br>好了，到这里，已经把上面的类图关系说完了，希望你能有所收获了，我也费了不少工夫啊（画图、生成代码、截图、写到BLOG上，唉，一头大汗）。不过如果能让你彻底理解UML类图的这些关系，也值得了。:)</p><img src ="http://www.cppblog.com/mzty/aggbug/47264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2008-04-16 17:09 <a href="http://www.cppblog.com/mzty/archive/2008/04/16/47264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中文xml FQA</title><link>http://www.cppblog.com/mzty/archive/2006/01/06/2469.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 06 Jan 2006 07:44:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/01/06/2469.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/2469.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/01/06/2469.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/2469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/2469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/01/06/2469.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/2469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-01-06 15:44 <a href="http://www.cppblog.com/mzty/archive/2006/01/06/2469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> uml中类对象间的关系</title><link>http://www.cppblog.com/mzty/archive/2006/01/03/2375.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Tue, 03 Jan 2006 06:17:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2006/01/03/2375.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/2375.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2006/01/03/2375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/2375.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/2375.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2006/01/03/2375.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/2375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2006-01-03 14:17 <a href="http://www.cppblog.com/mzty/archive/2006/01/03/2375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uml 基本概念</title><link>http://www.cppblog.com/mzty/archive/2005/12/30/2262.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Fri, 30 Dec 2005 02:01:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2005/12/30/2262.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/2262.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2005/12/30/2262.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/2262.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/2262.html</trackback:ping><description><![CDATA[1.建模 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;1.1 为什么要建模 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;建立大厦和建立狗窝的区别是建设狗窝不需要设计。要生产合格的软件就要有一套关于体系结构、过程和工具的规范。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;建模的定义：建模是对现实的简化。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;建模的目标： <BR>&nbsp;&nbsp;1）模型帮助我们按照实际情况或按照我们所需要的样式对系统进行可视化。 <BR>&nbsp;&nbsp;2）模型允许我们详细说明系统的结构和行为。 <BR>&nbsp;&nbsp;3）模型给出一个知道我们构造系统的模板。 <BR>&nbsp;&nbsp;4）模型对我们的决策进行文档化。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;建模就是把复杂的系统变成小的系统，采用“各个击破”的原则逐一解决。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;1.2 建模原理 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;1）选择创建什么模型很重要，模型要反映你难于处理的开发问题。 <BR>&nbsp;&nbsp;2）模型要在不同的精度级别上来表示。你可以根据观察的角色和观察的原因来选择精度。 <BR>&nbsp;&nbsp;3）建造模型要和现实相连。 <BR>&nbsp;&nbsp;4）重要的系统需要用一组独立的模型去处理。在面向对象的软件体系中，为了理解系统的体系结构，你需要几个互补和连锁的视图：用例图、设计视图、进程视图、实现视图和实施视图。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;1.3 面向对象的建模 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;面向算法的建模在需求发生变化或者系统增长后就变得难以维护。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;面向对象的建模把对象和类作为其主要构造块。例如，在三层结构中，我们可以在用户接口层、中间层和数据库层中找到你想要的对象。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;2 UML介绍 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;2.1 概述 <BR>&nbsp;&nbsp;UML可以对软件密集型系统的制品进行可视化、详述、构造和文档化。最好把它用于以用况（用例）为驱动、以体系结构为中心、跌代及增量的过程中。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;UML是一种语言，它是一种可视化的语言，它是一组图形符号。它可用于详细描述。它又是一种构造语言，可以直接生成代码。用Rational XDE就可以实现从UML到C#，或者从C#到UML的双向工程。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;2.2 UML的概念模型 <BR>&nbsp;&nbsp;学习建模的三个要素：UML的基本构造块、这些构造块放在一起的规则、一些运用于整个UML的公共机制。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;UML中由一些四种事物 <BR>&nbsp;&nbsp;1）结构事物 －－－ 类、接口、协作（它是一个交互，它是由一组共同工作以提供某协作行为的角色和其它元素构成的一个群体。）、用例、主动类（至少拥有一个进程或者线程，其元素的行为可以和其它元素的行为并发）、构件（如COM+和Java Bean）、节点。 <BR>&nbsp;&nbsp;2）行为事物 －－－ 交互、状态机（描述了一个对象或者一个交互在生命期内响应事件所经历的状态序列）。 <BR>&nbsp;&nbsp;3）分组事物 －－－ 包 <BR>&nbsp;&nbsp;4）注释事物 －－－ 注解 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;UML中的四种关系 <BR>&nbsp;&nbsp;1）依赖 －－－ 两个事物间的语义关系 <BR>&nbsp;&nbsp;2）关联 －－－ 是一种结构关系，如聚合 <BR>&nbsp;&nbsp;3）泛化 －－－ 一般/特殊关系 <BR>&nbsp;&nbsp;4）实现 －－－ 用在两种地方：接口和实现他们之间的类和构件之间；用例和实现他们的协作之间。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;UML中的图 <BR>&nbsp;&nbsp;1）类图 －－－ 系统的静态状态图，包含主动类的类图给除系统的静态进程视图。 <BR>&nbsp;&nbsp;2）对象图 <BR>&nbsp;&nbsp;3）用例图 <BR>&nbsp;&nbsp;4）顺序图 <BR>&nbsp;&nbsp;5）协作图 <BR>&nbsp;&nbsp;6）状态图 <BR>&nbsp;&nbsp;7）活动图 －－－ 强调对象间的控制流程 <BR>&nbsp;&nbsp;8）构件图 <BR>&nbsp;&nbsp;9）实施图 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;2.3 体系结构 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;我们用5个互联的视图来描述软件密集型系统的体系结构： <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;1）系统的用例图 <BR>&nbsp;&nbsp;2）系统的设计视图 －－－ 静态方面由类图和对象图描述，动态方面由交互图、状态图和活动图描述。 <BR>&nbsp;&nbsp;3）系统的进程视图 －－－ 包含了形成系统并发和同步机制的线程和进程。 <BR>&nbsp;&nbsp;4）系统的实现视图 －－－ 主要针对系统发布的配置管理。 <BR>&nbsp;&nbsp;5）系统的实施视图 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;2.4 软件开发生命周期 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;用况驱动 <BR>&nbsp;&nbsp;以体系结构为中心 <BR>&nbsp;&nbsp;跌代过程 －－－ 涉及到一连串可执行发布的管理。 <BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;软件开发生命周期的四个阶段： <BR>&nbsp;&nbsp;初始 <BR>&nbsp;&nbsp;细化 <BR>&nbsp;&nbsp;构造 <BR>&nbsp;&nbsp;移交 <BR><img src ="http://www.cppblog.com/mzty/aggbug/2262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2005-12-30 10:01 <a href="http://www.cppblog.com/mzty/archive/2005/12/30/2262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中DOM写XML </title><link>http://www.cppblog.com/mzty/archive/2005/12/29/2225.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Thu, 29 Dec 2005 01:48:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2005/12/29/2225.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/2225.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2005/12/29/2225.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/2225.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/2225.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 写xml中的问题，大家来共同讨论讨论！&nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2005/12/29/2225.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/2225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2005-12-29 09:48 <a href="http://www.cppblog.com/mzty/archive/2005/12/29/2225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uml中文FQA</title><link>http://www.cppblog.com/mzty/archive/2005/12/24/2048.html</link><dc:creator>梦在天涯</dc:creator><author>梦在天涯</author><pubDate>Sat, 24 Dec 2005 06:51:00 GMT</pubDate><guid>http://www.cppblog.com/mzty/archive/2005/12/24/2048.html</guid><wfw:comment>http://www.cppblog.com/mzty/comments/2048.html</wfw:comment><comments>http://www.cppblog.com/mzty/archive/2005/12/24/2048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mzty/comments/commentRss/2048.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mzty/services/trackbacks/2048.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/mzty/archive/2005/12/24/2048.html'>阅读全文</a><img src ="http://www.cppblog.com/mzty/aggbug/2048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mzty/" target="_blank">梦在天涯</a> 2005-12-24 14:51 <a href="http://www.cppblog.com/mzty/archive/2005/12/24/2048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>