﻿<?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-一步一个脚印-文章分类-UML</title><link>http://www.blogjava.net/flysky19/category/18233.html</link><description>java之路</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:44:20 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:44:20 GMT</pubDate><ttl>60</ttl><item><title>UML相关工具一览（择选）</title><link>http://www.blogjava.net/flysky19/articles/86780.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 10 Dec 2006 15:37:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/86780.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/86780.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/86780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/86780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/86780.html</trackback:ping><description><![CDATA[
		<p>原文：<a href="http://www.umlchina.com/Tools/Newindex1.htm">http://www.umlchina.com/Tools/Newindex1.htm</a><br /><br /><span lang="EN-US">Code Logic 2.1：<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica"><a href="http://www.logicexplorers.com/products/codelogic/details.html"><span lang="IT" style="mso-ansi-language: IT">http://www.logicexplorers.com/products/codelogic/details.html</span></a></span><br />特色：<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">强有力的、动态的双向工程，特别是从代码到顺序图的自动生成。<br />      相关：有试用版；<br /><br /><span lang="EN-US"><font face="Times New Roman">EclipseUML 2.0：<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica"><a href="http://www.omondo.com/">http://www.omondo.com/</a><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></font></span></span></span></p>
		<p class="MsoNormal">特色：<br /></p>
		<p class="MsoNormal">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">Eclipse</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及</span>
				<span lang="EN-US">CVS</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集成的</span>
				<span lang="EN-US">UML</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具。可以从字节码逆向工程到类图和序列图。<br /></span>
		</p>
		<p class="MsoNormal">相关：有免费版；<br /><br /><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica">Poseidon for UML 5.0:</span></p>
		<p class="MsoNormal">
				<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica">
						<a href="http://www.gentleware.com/">http://www.gentleware.com/</a>
						<o:p>
						</o:p>
				</span>
		</p>
		<o:p>特色：<br /><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于开源项目</span><span lang="EN-US">ArgoUML</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的商业产品，支持多国语言。集成到</span><span lang="EN-US">Eclipse</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，使得</span><span lang="EN-US">Poseidon</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利用其他工具的方便性大大增加，减少了许多</span><span lang="EN-US">import/export</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的工作。支持团队建模。下载量已经超过</span><span lang="EN-US">1,000,000</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">份。</span><span lang="EN-US">3.2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本增强了</span><span lang="EN-US">UML2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">序列图的支持。<br />版本：</span></p><p class="MsoNormal"><span lang="EN-US">Community Edition</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">免费，其他版本试用<br /><br /><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica">IBM Rational：</span></span></p><p class="MsoNormal"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica"><a href="http://www.rational.com/">http://www.rational.com/</a><br /><o:p></o:p></span></p><o:p>特色： 
<p class="MsoNormal"><span lang="IT" style="mso-ansi-language: IT">Rose/XDE</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的新版本。</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于</span><span lang="EN-US">UML2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的高端建模以及工具集，还包括应用开发、</span><span lang="EN-US">Web</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发、软件配置管理等工具</span><span lang="EN-US">. </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这些工具中都增加了对</span><span lang="EN-US">Eclipse3.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的支持，以及减少手工编码的各种新功能<br />版本：有试用版；<br /></span><span lang="IT" style="mso-ansi-language: IT"><o:p><br /></o:p></span></p><p class="MsoNormal"><span lang="EN-US">Together 2006：</span></p><p class="MsoNormal"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica"><a href="http://www.borland.com/together/index.html">http://www.borland.com/together/index.html</a><br />特色：<br /><o:p></o:p></span></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">强有力的工具。</span><span lang="IT" style="mso-ansi-language: IT">2006</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本支持</span><span lang="IT" style="mso-ansi-language: IT">UML2</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="IT" style="mso-ansi-language: IT">BPMN</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产生</span><span lang="IT" style="mso-ansi-language: IT">BPEL4WS</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。<br /></span><span lang="IT" style="mso-ansi-language: IT"><o:p>但太庞大，java实现，很慢；<br /><br /><span lang="EN-US">Visio 2003：</span></o:p></span></p><p class="MsoNormal"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica"><a href="http://www.microsoft.com/office/visio/">http://www.microsoft.com/office/visio/</a><o:p></o:p></span></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">微软的主力</span><span lang="IT" style="mso-ansi-language: IT">UML</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具<br /></span><span lang="IT" style="mso-ansi-language: IT"><o:p></o:p></span></p><p class="MsoNormal">国内使用广泛；<br /><br /><span lang="EN-US">Codagen Architect 3.2：<span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica"><a href="http://www.codagen.com/products/architect/default.htm">http://www.codagen.com/products/architect/default.htm</a><br />特色：<br /><o:p></o:p></span></span></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">遵循</span><span lang="EN-US">MDA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">流程，能产生超过</span><span lang="EN-US">90%</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">J2EE</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">.Net</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台代码。</span><span lang="EN-US">2003</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">年获得</span><span lang="EN-US">Jolt Productivity Award</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?><v:shape id="_x0000_i1038" style="WIDTH: 34.5pt; HEIGHT: 33pt" o:ole="" type="#_x0000_t75" coordsize="21600,21600"><v:imagedata src="Newindex1.files/image004.png" o:title=""></v:imagedata></v:shape></span></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持</span><span lang="EN-US">Rational Rose 2000e</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或更新版本，</span><span lang="EN-US">Rational XDE 2003</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang="EN-US">Borland Together ControlCenter 6.0, </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或带</span><span lang="EN-US">Visio</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">Visual Studio .NET for Enterprise Architects</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p><p class="MsoNormal">版本：15天评估版；<br /><br /><span lang="IT" style="mso-ansi-language: IT">Visual Paradigm for UML 5.1:</span></p><p class="MsoNormal"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: Helvetica"><a href="http://www.visual-paradigm.com/"><span lang="ES-TRAD" style="mso-ansi-language: ES-TRAD">http://www.visual-paradigm.com/</span></a></span><span lang="ES-TRAD" style="COLOR: black; FONT-FAMILY: Helvetica; mso-ansi-language: ES-TRAD"><o:p></o:p></span></p><p class="MsoNormal">特色：</p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持用例文档，文本分析。</span><span lang="EN-US">SDE for Eclipse</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang="EN-US">2.0</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持</span><span lang="EN-US">UML2.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持文本分析和</span><span lang="IT" style="mso-ansi-language: IT">CRC</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">卡能。支持</span><span lang="EN-US">Robustness Analysis</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。支持自定义形状或导入</span><span lang="IT" style="mso-ansi-language: IT">Visio</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: IT; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的图形。</span></p><p class="MsoNormal"><br /> </p></o:p></o:p>
<img src ="http://www.blogjava.net/flysky19/aggbug/86780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-10 23:37 <a href="http://www.blogjava.net/flysky19/articles/86780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational SoDA for Word中文乱码解决</title><link>http://www.blogjava.net/flysky19/articles/86759.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 10 Dec 2006 13:46:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/86759.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/86759.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/86759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/86759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/86759.html</trackback:ping><description><![CDATA[
		<p>2006年12月10日<br />参考资料：<a href="http://www.rxiao.com/collection/csdn/">http://www.rxiao.com/collection/csdn/</a>软件工程/336991.xml<br /><br />问：<br />请问由Rational SoDA for Word生成的文档中的中文都是"？",如何解决呢？<br /><br />就算用ctrl+c和ctrl+v复制到word中的中文也是"????????????????"！！！<br />我该怎么办？？？？？？？？？？？？？？<br />答：<br />在Rose建模的时候，应该设置字体为GB2312，然后再用soda生成的文档就是中文的了。<br />具体在那儿设，我忘了。手头也没有Rose</p>
		<p>反正在菜单里面<br />问：<br />to run<br />我在菜单的tools中的genernal中把所有的font都改成了宋体，字符集改成了chinese_gb2312,结果生成的文档和文档图里的中文还是"?"<br />我改的对不对？<br /></p>
		<p>to run<br />ok了,谢谢！太感谢了！！！<br />关掉rose，再打开后，就ok了：）<br /><br />其他相关：<br />soda在从rose中生成文档的时候，对中文的支持非常不好，所以现在仍然建议大家尽量在Rose的模型中使用英文。<br /><br />那么你们给客户看什么呢？<br />怎么让客户了解你们的进度呢？<br />老板总是说，见客户时要给他看点什么，这样才好交流<br /><br />客户了解进度可以通过很多方式，比如说：项目开发计划、产品原型、用例阐述这些需求方面的工件等等。而实际上当项目进入分析/设计阶段后产生的工件一般是不需要用户进行确认和了解的，用户只要通过项目开发计划和项目计划就可以了解到项目的进度，如果要和用户交流，那就通过产品界面原型等工件与用户进行交流即可。<br /><br />修改模板：<br />找到你的ROSE安装目录，下面有SoDAWord-&gt;template-&gt;rose目录，下面存放的就是SoDA的word模板，你可以根据需要修改；<br /><br /><br /><br /></p>
<img src ="http://www.blogjava.net/flysky19/aggbug/86759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-10 21:46 <a href="http://www.blogjava.net/flysky19/articles/86759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational rose生成代码及其反向工程功能手册(转载和补充)</title><link>http://www.blogjava.net/flysky19/articles/86616.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sun, 10 Dec 2006 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/86616.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/86616.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/86616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/86616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/86616.html</trackback:ping><description><![CDATA[
		<font size="4">原文：</font>
		<a href="http://lzqdiy.bokee.com/5344025.html">
				<font size="4">http://lzqdiy.bokee.com/5344025.html</font>
		</a>
		<br />
		<font size="4">2006年12月10日<br /><b>关键词</b>： </font>
		<a href="http://tag.bokee.com/tag/rose" target="_blank">
				<font size="4">rose</font>
		</a>
		<font size="4">    </font>
		<a href="http://tag.bokee.com/tag/%C9%FA%B3%C9%B4%FA%C2%EB" target="_blank">
				<font size="4">生成代码</font>
		</a>
		<font size="4">    </font>
		<a href="http://tag.bokee.com/tag/%B7%B4%CF%F2%B9%A4%B3%CC" target="_blank">
				<font size="4">反向工程</font>
		</a>
		<font size="4">                                           </font>
		<p>
				<font size="4"> rose是最流行的建模工具,一是标准(历史悠久用的人多),二是自始至终贯穿体现了RUP的思想(使用Rational suite)，虽然实际工作中我们因为诸多因素不能够完全按照RUP方法来指导整体开发过程，但相信多数团队还是围绕在rose身边使用了'简化版'的需求分析设计，而多半使用了不怎么地道的'XP'开发:)<br />      ROSE思想是复杂的，内涵是丰富的，操作是别扭的，文档是简单的，人性是没有的。然而人们对它趋之若鹜的原因恐怕是我们现在的TEAMLEADER,SA受RUP的'毒害'颇深的原因，而这也将影响到徒弟--将来的SA们。<br />      <br />一 通过模型生成代码 </font>
		</p>
		<p>
				<font size="4">rose帮助位于 HELP&gt;&gt;CONTENTS&gt;&gt;ROSE JAVA&gt;&gt;HOW TO &gt;&gt;FORWARD ENGINEER FROM  ROSE  TO JAVA SOURCE <br /><br /><br /> 当你尝试把模型组件转化成代码框架时候，应该考虑到先检查将要生成的类有无语法错误。<br /> 1 打开你要专化的目标diagram<br /> 2 选择你要转化的包或者类<br /> 3.单击  tools&gt;java/j2ee&gt;  Syntax Check 来检查目标代码是否符合规范，比如命名错误。<br /> 4 察看rose log窗口(下方）察看检验结果，如果有错误，即errors那么生成的代码很可能无法通<br /> 过编译<br /> 5 根据需要校正这些组件或者图<br /> 6重复 步骤3直到检验不出错误，然后你就可以进入下一步了   <br /> 假设以上步骤已经搞定了error<br /> 7 选择你要转化的包或者类<br /> 8单击 Tools &gt; Java/J2EE &gt; Generate Code<br /> 一般来说如果你还没有将一个package或者组件映射到一个rose的classpath目录中(就是指定生<br /> 成的东西放哪里)，那么系统不会允许你在接下来的界面里点ok，那么现在就编辑目标路径<br /> 9点classpath entries下的edit按钮，再出现的界面右上角找new(insert)(删除左边那个),然后在列表里新增的行里选择目标路径，你可以选择目标是生成一个zip，jar,还是一个目录，我们选择<br /> 目录。指定目录，ok,那么你选择的路径就新建成功了，选择这个路径，点ok回到界面（层次<br /> 好多阿，界面很丑阿）<br /> 10现在你看到classpath entries里有东西了，选择右侧列表里你要转换的包或者组件，点assign<br /> ，即分配给目标classpth，理论上你可以把选择好的包组件或者类图分别分配个多个classptah<br /> 对象。点ok开始生成<br /> 11成功后就可以到指定的classpath下看代码了，生成的代码之间拥有如类图所示的关系。<br /> <br /> <br />二 反向功能<br />rose帮助位于 HELP&gt;&gt;CONTENTS&gt;&gt;ROSE JAVA&gt;&gt;HOW TO &gt;&gt;REVERSE ENGINEER FROM  JAVA SOURCE TO ROSE           <br />反向工程就是通过java代码生成或者更新一个模型的过程。你可以用ROSE对以下文件进行反向<br />  A.Java source code (.java files) <br />  B.Java bytecodes (.class files) <br />  C.zip, .cab, and .jar files<br /> 1. Open the model you want to create or update. <br /> 打开一个你刚创建或者想更新的模型<br /> 新建一个class diagram（如果你还不会，那么这篇文章就别看了）<br /> 2.单击Tools &gt; Java/J2EE &gt; Reverse Engineer<br /> 那么现在大家可以想象一下rose会怎么做,刚才是选择了图，创建目标路径，生成代码，那么<br /> 现在是否指定路径读文件生成图呢，you can say that again!!<br /> 在出现的界面上选择一个classpath（如果已经存在）当然，你也可以通过edit classpath按钮新<br /> 建一个（新建路径的界面刚才讲过了，不再累赘），然后选择这个classpath，更改下面的filter<br /> 下拉列表，更改目标文件类型(注意不仅仅三行，可以滚动的，对rose的界面真是垃圾这一点<br /> 又深有体会了)，我们这里选择.java，如果这个classptah下存在.java文件，那么就会被列出来<br /> 。<br /> 注意：你可以通过 add添加选中的文件，也可以通过add all添加所有列出来的，更可以通过<br /> add recursive 递归添加这个路径下所有的文件和子目录下所有文件等等。可以看到rose并不会自动列出甚至显示有没有子目录（无人性)<br /> 从添加好的文件里选择你想反向的文件，点Reverse 开始创建或者更新<br /> 无论成功还是失败都会警告，并有log。有错你就改到没错为止。<br /> 假设你成功了，点击done结束反向，回到rose主界面。            <br /> 注意:rose并不会针对你反向过来的类和组件自动生成图，生成的class已经按照包关系列在你的<br />        class diagram下面，你需要把他们加到你的图中去(靠,什么玩艺) ,你有两种方法让这个半自动反向工程化上句号。<br />   1手工把class或者组件拖拉到目的图里<br />   2在目标图的界面下点击 Query &gt; Add Classes 或者 Query &gt; Add Components ，选择视图方式<br />   ，一般是logic view,选择要拖拉的类或者组件，&gt;&gt;或者all，点ok完成。生成的类图即反映了代码本身之间的关系。<br />     ok.教程结束,因为没有抓图软件,懒得拷屏幕，加之文字比较详细，相信拥有写代码能力和<br />     自学能力的诸位看官理解没问题。作为一个SE,SA,必须掌握的工具，ROSE还有很多功能隐<br />     藏在稀奇古怪的界面下，如果你不是一个RUP方法的顽固FANS，也没有受到经典学院派的'<br />     教导',或者干脆就是一个开发人员,那么推荐大家还是快速的投入到together或者Poseidon的怀中吧。<br /><br /><br /><br /><br />自己的补充：<br />参考资料：<br />怎样由rational rose类图生成java代码<br /></font>
				<a href="http://topic.csdn.net/t/20030410/19/1644982.html">
						<font size="4">http://topic.csdn.net/t/20030410/19/1644982.html</font>
				</a>
				<br />
				<br />
				<font size="4">1.安ROSE前先安JDK，       <br />  不然，要设置一下jdk的路径或者用ROSE找一下JDK的目录：<br />  Tools--&gt;java/J2EE--&gt;Project Specification--&gt;CLASSPATH--&gt;new<br /><br />2. 然后，画图的时候，   <br />  打开J2EE，这个最全啦 ，会自动导入三个包：java、javax、org；  <br />  否则，复杂的类，可能转的不对；<br />  <br />  不过，使用J2EE model需要导入大量的包，会有点慢，只是第一次练习“from  class diagram to java source”的话，打开rose时点cancle不选任何model <br />  就可以；<br />3.斜菱形表示public，钥匙表示Protected，锁表示private，T表示default；<br />4.生成代码之前，在“open standard specification”中的“Attributes”和“Operations”中设置属性的type，方法的返回值等；<br />5.可以在“关联关系”等的箭头中指定引用的名称；<br />6.可以设置JAVADOC，   <br />   还能自动产生MAIN，（<font color="#800080">未找到相应项</font>）<br /><br />  可以对类的属性，加READ　WRITE方法，这个还是很好用的，不然，GET<br />  的，SET的会写好多，设置：<br />  右键单击要生成代码的类，选open   standard   Specification-&gt;Attributes,再右键单<br />  击要生成setter/getter的属性，选specification-&gt;java.....<br />  然后按“edit   set”   <br />  将“propertyType”改为“simple”,就可以了；<br />（read/write的默认值就已经是read/write);<br /><br />参考：</font>
				<a href="http://topic.csdn.net/t/20020624/11/825787.html">
						<font size="4">http://topic.csdn.net/t/20020624/11/825787.html</font>
				</a>
				<br />
				<br />
				<font size="4">7.一个小技巧：   <br />   把默认语言设为JAVA： tools-option-notation-default<br />  因为，你一般不会对使用的语言换来换去的，   <br />  这样的话，   只要一产生类，就是JAVA类，   <br />    <br />  并且，   右击，有一项就相应变为“java/J2EE”;<br />（如果默认语言时C++，右击的那项是“ANSI C++”）<br />  双击的项也变了， 不是General的项了   直接是JAVA类属性  ；<br /> <br />8.我们要做的第一个步骤就是要先进行语法检查，   <br />  这一步，是关键；<br /> 有时需要语法检查之后，“java/J2EE”中的“Genarate code”<br />  这项才从灰色变为可用项；<br />    <br />  然后设置好CLASSPATH的输出路径就可以了；<br /><br />9.导出代码   <br />  在导出代码的过程中，我们可以看到“OK”按钮和两视图间的“Assign”按钮都是灰色的。这时候，我们<strong>要选择两个部分</strong>，<br />一个是在视图中左侧的“CLASSPATH   Entries”要选择一个你要导出代码的路径，点击让它变成蓝色就可以了。   <br />  这时候，按钮“OK”和“Assign”按钮仍然是灰色的。   <br />  下面我们还要确定右边哪个包是要导出的，这里很明显就是“scInfoTech”。我们把它和它的组件视图全部选中。这时候，“OK”按钮和“Assign”按钮都变成可用的了。<br /><br />10. ROSE产生的代码，每个类，每个方法，都会打上一个ROSE号，   <br />  后期可反转，   <br />  就是从代码到类图！   <br />  若想去掉roseid：Tools--&gt;java/J2EE--&gt;Project Specification--&gt;Code Generation；<br /><br />11.不过，就本身而言，   <br />    <br />  产生的代码水平也是不敢^%#%$@%$#**^*&amp;^^&amp;^%#^%#   <br />    <br />  好象没有写的好！<br /> <br />  不过可以修改代码：java/J2EE--&gt;edit code...;  <br />    <br />  但是ROSE的反转厉害的很，   <br />    <br />  可以转CLASS的，   <br />  生成的图，带有关系，   <br />    <br />  用来分析别人的代码，   <br />  VERY爽　！！！  <br /> <br />12.把类图、顺序图等图片保存到word中：<br />     点工具栏中的“fit in window”－&gt;“copy”—&gt;粘贴到word；<br />     这样得到的图片又清晰又完整又小，通常不到10k；如果图片太小，在word中<br />     可以以200％的比例阅读：“视图”菜单—&gt;“显示比例”；<br /><br />13.Rational Rose怎么导入java类库？：<br />     问：我想用java代码生成rose模型，可是总是有一些类找不到，需要导入jdk<br />             或者其他的类包,请问怎么操作？<br />      答：菜单   tools   -&gt;   Java/J2EE   -&gt;   Project   Specification   <br />              在Classpaths中加入类库路径，比如   <br />              D:\JBuilder6\jdk1.3.1\src.jar<br /><br />14.画好了类图、顺序图，并加上了所有的操作，注释，说明等，怎么才能自动<br />     生成设计文档？（<font color="#ff0000">现在还不会，还没装SODA</font>）<br />参考资料：</font>
				<a href="http://topic.csdn.net/t/20021209/19/1245009.html">
						<font size="4">http://topic.csdn.net/t/20021209/19/1245009.html</font>
				</a>
				<br />
				<br />
				<font size="4">  问：我在rose中画了一个类图，所有操作什么的都有了，也都写了注释。   <br />           但怎么才能自动生成设计文档呢？总不能把注释一个一个的拷出来吧。  <br /><br /> 答：在report菜单总选择SoDA   Report，再选择report   template（比如Detail   of          all   of   attribute   and   operations   by   class   by   package）<br /><br /> 问：怎么没有SoDA选项？是不是要先装soda   for   word<br /><br /> 答：先装soda，还要有word<br />          </font>
				<a href="http://www.rational.com/">
						<font size="4">http://www.rational.com/</font>
				</a>
				<font size="4">   上有不少文档<br /><br />问：谢谢诸位的回答.我已经装上了,     虽然生成的文档有点儿乱,   <br />         但可以看出这是一个功能很强大的工具.   <br /><br />答：其实最好的办法是根据你们文档的要求自己定制soda的模版，定制的过程说<br />         起来很麻烦，但是其实并不复杂，看看soda的教学文档，半天就可以掌握了<br /><br />15.画类图的时候，最好把类按“包”组织；并跟java代码实现时的包结构对应；没有包，所有的类堆积在一起将是一盘散沙。<br /><br /><br /><br />ok！<br /><br /><br /><br /><br /><br /> <br />   <br /><br /><br /></font>
		</p>
<img src ="http://www.blogjava.net/flysky19/aggbug/86616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-10 11:19 <a href="http://www.blogjava.net/flysky19/articles/86616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML类图关系全面剖析和C++代码表现（转载）</title><link>http://www.blogjava.net/flysky19/articles/86585.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sat, 09 Dec 2006 13:27:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/86585.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/86585.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/86585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/86585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/86585.html</trackback:ping><description><![CDATA[原文：<a href="http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx">http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx</a><br />2006年12月10日<br /><br /><p>本文随便转载，请保留出处：<a href="http://blog.csdn.net/dylgsy/">http://blog.csdn.net/dylgsy/</a></p><p><font size="1">UML的类图关系分为： 关联、聚合/组合、依赖、泛化（继承）。而其中关联又分为双向关联、单向关联、自身关联；下面就让我们一起来看看这些关系究竟是什么，以及它们的区别在哪里。</font><br /><br /><strong>1、关联</strong><br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/doubleAssoc.JPG" /><br /><br /><font size="1">双向关联：<br />C1-C2：指双方都知道对方的存在，都可以调用对方的公共属性和方法。<br /><br />在GOF的设计模式书上是这样描述的：虽然在分析阶段这种关系是适用的，但我们觉得它对于描述设计模式内的类关系来说显得太抽象了，因为在设计阶段关联关系必须被映射为对象引用或指针。对象引用本身就是有向的，更适合表达我们所讨论的那种关系。所以这种关系在设计的时候比较少用到，关联一般都是有向的。<br /><br />使用ROSE 生成的代码是这样的：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C1 <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" style="DISPLAY: none" 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" /></span><span id="_10_33_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_10_33_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />    C2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> 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" />}</span></span><span style="COLOR: #000000">;<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" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C2 <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" style="DISPLAY: none" 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" /></span><span id="_47_70_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_47_70_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />    C1</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> 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" />}</span></span><span style="COLOR: #000000">;</span></div></div><p><font size="1">双向关联在代码的表现为双方都拥有对方的一个指针，当然也可以是引用或者是值。</font><br /><br /><br /><br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/uniAssoc.JPG" /><br /><br /><font size="1">单向关联:<br />C3-&gt;C4：表示相识关系，指C3知道C4，C3可以调用C4的公共属性和方法。没有生命期的依赖。一般是表示为一种引用。<br /><br />生成代码如下：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C3 <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" style="DISPLAY: none" 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" /></span><span id="_10_33_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_10_33_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />    C4</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> 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" />}</span></span><span style="COLOR: #000000">;<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" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C4 <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" style="DISPLAY: none" 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" /></span><span id="_47_50_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_47_50_Open_Text"><span style="COLOR: #000000">{<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" />}</span></span><span style="COLOR: #000000">;</span></div></div><p><font size="1">单向关联的代码就表现为C3有C4的指针，而C4对C3一无所知。</font><br /><br /><br /></p><p><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/selfAssoc.JPG" /><br /><br /><font size="1">自身关联（反身关联）：<br />自己引用自己，带着一个自己的引用。<br /><br />代码如下：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C14 <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" style="DISPLAY: none" 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" /></span><span id="_11_36_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_11_36_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />    C14</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> 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" />}</span></span><span style="COLOR: #000000">;</span></div></div><p><font size="1">就是在自己的内部有着一个自身的引用。<br /><br /></font><font size="1"><strong>2、聚合/组合<br /></strong><br />当类之间有整体-部分关系的时候，我们就可以使用组合或者聚合。</font><br /><br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/Aggregation.JPG" /><br /><br /><font size="1">聚合：表示C9聚合C10，但是C10可以离开C9而独立存在（独立存在的意思是在某个应用的问题域中这个类的存在有意义。这句话怎么解，请看下面组合里的解释）。<br /><br />代码如下：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C9 <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" style="DISPLAY: none" 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" /></span><span id="_10_34_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_10_34_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />    C10 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" />}</span></span><span style="COLOR: #000000">;<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" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C10 <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" style="DISPLAY: none" 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" /></span><span id="_49_52_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_49_52_Open_Text"><span style="COLOR: #000000">{<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" />}</span></span><span style="COLOR: #000000">;<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div></div><p> </p><p><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/Composition.JPG" /><br /><br /><font size="1">组合（也有人称为包容）：一般是实心菱形加实线箭头表示，如上图所示，表示的是C8被C7包容，而且C8不能离开C7而独立存在。但这是视问题域而定的，例如在关心汽车的领域里，轮胎是一定要组合在汽车类中的，因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里，就算轮胎离开了汽车，它也是有意义的，这就可以用聚合了。在《敏捷开发》中还说到，A组合B，则A需要知道B的生存周期，即可能A负责生成或者释放B，或者A通过某种途径知道B的生成和释放。<br /><br />他们的代码如下：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C7 <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" style="DISPLAY: none" 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" /></span><span id="_10_32_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_10_32_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />    C8 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" />}</span></span><span style="COLOR: #000000">;<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" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C8 <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" style="DISPLAY: none" 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" /></span><span id="_46_48_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_46_48_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span></div></div><p><font size="1">可以看到，代码和聚合是一样的。具体如何区别，可能就只能用语义来区分了。<br /><br /><strong>3、依赖</strong></font><br /><br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/Dependancy.JPG" /><br /><br /><font size="1">依赖:<br />指C5可能要用到C6的一些方法，也可以这样说，要完成C5里的所有功能，一定要有C6的方法协助才行。C5依赖于C6的定义，一般是在C5类的头文件中包含了C6的头文件。ROSE对依赖关系不产生属性。<br /><br />注意，要避免双向依赖。一般来说，不应该存在双向依赖。<br /><br />ROSE生成的代码如下：</font><br /></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> C5.h</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C6.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><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" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C5 <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" style="DISPLAY: none" 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" /></span><span id="_35_38_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_35_38_Open_Text"><span style="COLOR: #000000">{<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" />}</span></span><span style="COLOR: #000000">;<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" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> C6.h</span><span style="COLOR: #008000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C5.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><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" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> 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" style="DISPLAY: none" 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" /></span><span id="_76_79_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_76_79_Open_Text"><span style="COLOR: #000000">{<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" />}</span></span><span style="COLOR: #000000">;<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div></div><p><font size="1">虽然ROSE不生成属性，但在形式上一般是A中的某个方法把B的对象作为参数使用(假设A依赖于B)。如下：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">B.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> 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" style="DISPLAY: none" 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" /></span><span id="_23_52_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_23_52_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />          </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> Func(B </span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b);<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div></div><p><font size="1"><strong><font color="#ff0000">那依赖和聚合\组合、关联等有什么不同呢？</font></strong><br /><br />关联是类之间的一种关系，例如老师教学生，老公和老婆，水壶装水等就是一种关系。这种关系是非常明显的，在问题领域中通过分析直接就能得出。<br /><br />依赖是一种弱关联，只要一个类用到另一个类，但是和另一个类的关系不是太明显的时候（可以说是“uses”了那个类），就可以把这种关系看成是依赖，依赖也可说是一种偶然的关系，而不是必然的关系，就是“我在某个方法中偶然用到了它，但在现实中我和它并没多大关系”。例如我和锤子，我和锤子本来是没关系的，但在有一次要钉钉子的时候，我用到了它，这就是一种依赖，依赖锤子完成钉钉子这件事情。</font></p><p><font size="1">组合是一种整体-部分的关系，在问题域中这种关系很明显，直接分析就可以得出的。例如轮胎是车的一部分，树叶是树的一部分，手脚是身体的一部分这种的关系，非常明显的整体-部分关系。<br /><br />上述的几种关系（关联、聚合/组合、依赖）在代码中可能以指针、引用、值等的方式在另一个类中出现，不拘于形式，但在逻辑上他们就有以上的区别。<br /><br />这里还要说明一下，所谓的这些关系只是在某个问题域才有效，离开了这个问题域，可能这些关系就不成立了，例如可能在某个问题域中，我是一个木匠，需要拿着锤子去干活，可能整个问题的描述就是我拿着锤子怎么钉桌子，钉椅子，钉柜子；既然整个问题就是描述这个，我和锤子就不仅是偶然的依赖关系了，我和锤子的关系变得非常的紧密，可能就上升为组合关系（让我突然想起武侠小说的剑不离身，剑亡人亡...）。这个例子可能有点荒谬，但也是为了说明一个道理，就是关系和类一样，它们都是在一个问题领域中才成立的，离开了这个问题域，他们可能就不复存在了。<br /><br /><br /><strong>4、泛化（继承）</strong></font><br /><br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/inheri.jpg" /><br /><br /><font size="1">泛化关系：如果两个类存在泛化的关系时就使用，例如父和子，动物和老虎，植物和花等。<br />ROSE生成的代码很简单，如下：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#include </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C11.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><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" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C12 : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> 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" style="DISPLAY: none" 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" /></span><span id="_41_43_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_41_43_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;</span></div></div><p><br /><strong><font size="1">5、这里顺便提一下模板</font></strong><br /><br /><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dylgsy/Template.jpg" /><br /><br /><font size="1">上面的图对应的代码如下：</font></p><div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"><div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> C13 <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" style="DISPLAY: none" 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" /></span><span id="_25_27_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id="_25_27_Open_Text"><span style="COLOR: #000000">{<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000">;<br /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div></div><p><font size="1">这里再说一下重复度，其实看完了上面的描述之后，我们应该清楚了各个关系间的关系以及具体对应到代码是怎么样的，所谓的重复度，也只不过是上面的扩展，例如A和B有着“1对多”的重复度，那在A中就有一个列表，保存着B对象的N个引用，就是这样而已。<br /><br />好了，到这里，已经把上面的类图关系说完了，希望你能有所收获了，我也费了不少工夫啊（画图、生成代码、截图、写到BLOG上，唉，一头大汗）。不过如果能让你彻底理解UML类图的这些关系，也值得了。:)<br /><br /><br /></font></p><div class="post"><div class="postTitle"><a title="permalink: 回复：UML类图关系全面剖析" href="http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx#475350">#</a> <a name="475350"> </a>index 发表于2006-08-17 11:42:00  IP: 218.81.82.*</div><div class="postText">对象（或类）间的关系就两种：引用和继承。 其他关系都是在这两种基础上演化而成。<br /><br /><div class="post"><div class="postTitle"><a title="permalink: 回复：UML类图关系全面剖析" href="http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx#475640">#</a> <a name="475640"> </a>jackezou 发表于2006-08-17 22:04:00  IP: 221.216.173.*</div><div class="postText">聚合和组合那部分好象有些问题，两者生成的代码怎么会是一样的呢？ <br />记得vckase.com有一篇文章《C++编程杂谈之四：漫谈UML <br />》，里面说聚合是一种相对松散的关系，因此C9应该含有C10的指针而不是C10的对象。 <br /><br />希望作者能继续就这问题解释一下，谢谢！！<br /><br /><div class="post"><div class="postTitle"><a title="permalink: 回复：UML类图关系全面剖析" href="http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx#475670">#</a> <a name="475670"> </a>一雨田 发表于2006-08-17 22:33:00  IP: 219.136.188.*</div><div class="postText">对，聚合是一种相对松散的关系，文章里也说了，在ROSE里面生成的代码确实和组合是一样的。他们的松散应该不在于是指针、值或者引用，你可以尝试用ROSE画两个图——聚合和组合，你可能发现ROSE不提供“组合关系”这种图形（实心菱形，我用的是ROSE2002），然后你打开关系(Aggregation)的Specification-&gt;Role B Detail，你会发现有三项选（By Value, By Reference, Unspecified），在你选上By Value的时候，菱形就变成实心的了，其他两个都是空心菱形，这三种我都试过了，生成的代码都是一样的，所以我想组合和聚合的区别应该是一种语义上的区别，语义上的松散。当然在我们的印象中可能指针是比对象要松散一点，因为如果是对象的话，就要管它的生命期了，所以实际应用时，我觉得可以象你说的那样，聚合用指针，组合用对象。：）<br /><br /><div class="post"><div class="postTitle"><a title="permalink: 回复：UML类图关系全面剖析" href="http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx#476095">#</a> <a name="476095"> </a>jackezou 发表于2006-08-19 09:17:00  IP: 61.149.248.*</div><div class="postText">OK, 谢谢！<br /><br /><div class="post"><div class="postTitle"><a title="permalink: 回复：UML类图关系全面剖析" href="http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx#480756">#</a> <a name="480756"> </a>sheismylife 发表于2006-08-31 14:09:00  IP: 218.1.97.*</div><div class="postText">字太小了</div></div><br /><div class="post"><div class="postTitle"><a title="permalink: 回复：UML类图关系全面剖析" href="http://blog.csdn.net/dylgsy/archive/2006/08/16/1076044.aspx#483668">#</a> <a name="483668"> </a>一雨田 发表于2006-09-07 22:36:00  IP: 222.129.97.*</div><div class="postText">这个字是按照IE 设置的，如果想快捷设置字的大小就按住CTRL然后用鼠标滚轮上下滚就会看到效果了。</div></div></div></div></div></div></div></div></div></div><img src ="http://www.blogjava.net/flysky19/aggbug/86585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-09 21:27 <a href="http://www.blogjava.net/flysky19/articles/86585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类与类关系的UML图与代码表现（转载和自己的补充）</title><link>http://www.blogjava.net/flysky19/articles/86524.html</link><dc:creator>不断前进的小乌龟</dc:creator><author>不断前进的小乌龟</author><pubDate>Sat, 09 Dec 2006 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/flysky19/articles/86524.html</guid><wfw:comment>http://www.blogjava.net/flysky19/comments/86524.html</wfw:comment><comments>http://www.blogjava.net/flysky19/articles/86524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flysky19/comments/commentRss/86524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flysky19/services/trackbacks/86524.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial">
						<font color="#006699">原文：<a href="http://www.javaeye.com/post/182099">http://www.javaeye.com/post/182099</a><br />2006年12月10日<br /><br />关键字:   <b>OO</b> 泛化,依赖,关联,聚合 </font>
						<br />类与类之间的关系对于理解面向对象具有很重要的作用，以前在面试的时候也经常被问到这个问题，在这里我就介绍一下。<br />类与类之间存在以下关系:<br /><strong><font color="#3366ff">(1)泛化(Generalization)<br />(2)关联(Association)<br />(3)依赖(Dependency)<br />(4)聚合(Aggregation)</font></strong></font>
		</p>
		<p>
				<font face="Arial">
						<strong>UML图与应用代码例子:</strong>
						<br />
						<strong>
								<font color="#ff9900" size="4">
										<font color="#3366ff">1.泛化(Generalization)</font>
										<br />
								</font>
								<font color="#339966" size="3">[泛化]</font>
								<br />
						</strong>表示类与类之间的继承关系，接口与接口之间的继承关系，或类对接口的实现关系。一般化的关系是从子类指向父类的，与继承或实现的方法相反。<br /><font color="#339966" size="3"><strong>[具体表现]<br /></strong></font><font color="#ff0000">父类</font> 父类实例＝new <font color="#ff0000">子类</font>()<br /><strong><font color="#339966" size="3">[UML图](图1.1)<br /></font><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1320/10bfdb9d-ed2d-4226-bab2-f814d2e10a82.jpg" /><br /></strong><font face="Arial"><font color="#339966"><strong>图1.1</strong></font><strong>Animal类与Tiger类,Dog类的依赖关系<br /></strong></font><br /><strong><font color="#339966" size="3">[代码表现]</font><br /><br /></strong></font>
		</p>
		<div class="dp-highlighter">
				<div class="bar">
						<strong>
						</strong>
				</div>
				<ol class="dp-j">
						<li class="alt">
								<span>
										<span class="keyword">class</span>
										<span>
												<strong> Animal{}   </strong>
										</span>
								</span>
								<strong>
								</strong>
						</li>
						<li class="">
								<span>
								</span>
								<span class="keyword">class</span>
								<strong>
										<span> Tiger </span>
										<span class="keyword">extends</span>
										<span> Animal{}   </span>
								</strong>
						</li>
						<li class="alt">
								<span>
								</span>
								<span class="keyword">public</span>
								<strong>
										<span> </span>
										<span class="keyword">class</span>
										<span> Test   </span>
								</strong>
						</li>
						<li class="">
								<strong>
										<span>{   </span>
								</strong>
						</li>
						<li class="alt">
								<strong>
										<span>    </span>
										<span class="keyword">public</span>
										<span> </span>
										<span class="keyword">void</span>
										<span> test()   </span>
								</strong>
						</li>
						<li class="">
								<strong>
										<span>    {   </span>
								</strong>
						</li>
						<li class="alt">
								<strong>
										<span>        Animal a=</span>
										<span class="keyword">new</span>
										<span> Tiger();   </span>
								</strong>
						</li>
						<li class="">
								<strong>
										<span>    }   </span>
								</strong>
						</li>
						<li class="alt">
								<strong>
										<span>}  </span>
								</strong>
						</li>
				</ol>
		</div>
		<br />
		<font face="Arial">
				<strong>
						<font color="#3366ff" size="4">2.依赖(Dependency)</font>
						<br />
				</strong>
				<font color="#339966" size="3">
						<strong>[依赖]<br /></strong>
				</font>对于两个相对独立的对象，当一个对象负责构造另一个对象的实例，或者依赖另一个对象的服务时，这两个对象之间主要体现为依赖关系。<br /><font color="#339966" size="3"><strong>[具体表现]<br /></strong></font>依赖关系表现在<font color="#ff0000">局部变量</font>，<font color="#ff0000">方法的参数</font>，以及对<font color="#ff0000">静态方法的调用</font><br /><font color="#339966" size="3"><strong>[现实例子]<br /></strong></font>比如说你要去拧螺丝，你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作<br /><font color="#339966" size="3"><strong>[UML表现](图1.2)</strong></font><br /><p align="left"><strong><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1319/ec7bca6c-c01a-4772-a91b-3a695773ddfb.jpg" /></strong></p><p align="left"><br /><font face="Arial"><strong><font color="#339966">图1.2 </font></strong>Person类与Screwdriver类的依赖关系<br /><font face="Arial"><font color="#339966" size="3"><strong><br />[代码表现] </strong></font></font></font></p><div class="dp-highlighter"><div class="bar"><strong></strong></div><ol class="dp-j"><li class="alt"><span><span class="keyword">public</span><strong><span> </span><span class="keyword">class</span><span> Person{   </span></strong></span><strong></strong></li><li class=""><strong><span>    </span><span class="comment">/** 拧螺丝 */</span><span>  </span></strong></li><li class="alt"><strong><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> screw(Screwdriver screwdriver){   </span></strong></li><li class=""><strong><span>        screwdriver.screw();   </span></strong></li><li class="alt"><strong><span>    }   </span></strong></li><li class=""><strong><span>}  </span></strong></li></ol></div><br /><font face="Arial"><strong><font color="#3366ff" size="4">3.关联(Association)</font><br /></strong><font color="#339966" size="3"><strong>[关联]<br /></strong></font>对于两个相对独立的对象，当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时，这两个对象之间为关联关系。<br /><font color="#339966" size="3"><strong>[具体表现]<br /></strong></font>关联关系是使用<font color="#ff0000">实例变量</font>来实现<br /><font color="#339966" size="3"><strong>[现实例子]<br /></strong></font>比如客户和订单，每个订单对应特定的客户，每个客户对应一些特定的订单；再例如公司和员工，每个公司对应一些特定的员工，每个员工对应一特定的公司<br /><strong><font color="#339966" size="3">[UML图] (图1.3)<br /></font><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1318/d4b10677-364d-4c34-beb7-416f8e835d8c.jpg" /><br /><font face="Arial"><strong><font color="#339966">图1.3 </font></strong>公司和员工的关联关系</font></strong></font><br /><font face="Arial"><strong><br /><font color="#339966" size="3">[代码表现]</font></strong><div class="dp-highlighter"><div class="bar"><strong></strong></div><ol class="dp-j"><li class="alt"><span><span class="keyword">public</span><strong><span> </span><span class="keyword">class</span><span> Company{   </span></strong></span><strong></strong></li><li class=""><strong><span>    </span><span class="keyword">private</span><span> Employee employee;   </span></strong></li><li class="alt"><strong><span>    </span><span class="keyword">public</span><span> Employee getEmployee(){   </span></strong></li><li class=""><strong><span>        </span><span class="keyword">return</span><span> employee;   </span></strong></li><li class="alt"><strong><span>    }   </span></strong></li><li class=""><strong><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setEmployee(Employee employee){   </span></strong></li><li class="alt"><strong><span>        </span><span class="keyword">this</span><span>.employee=employee;   </span></strong></li><li class=""><strong><span>    }   </span></strong></li><li class="alt"><strong><span>    </span><span class="comment">//公司运作 </span><span>  </span></strong></li><li class=""><strong><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> run(){   </span></strong></li><li class="alt"><strong><span>        employee.startWorking();   </span></strong></li><li class=""><strong><span>    }   </span></strong></li><li class="alt"><strong><span>}  </span></strong></li></ol></div></font></font>
		<font face="Arial">
				<strong>
						<font color="#3366ff" size="4">(4)聚合（Aggregation）</font>
						<br />
						<font color="#339966" size="3">[聚合]<br /></font>
				</strong>当对象A被加入到对象B中，成为对象B的组成部分时，对象B和对象A之间为聚集关系。聚合是关联关系的一种，是较强的关联关系，强调的是<font color="#ff0000">整体</font>与<font color="#ff0000">部分</font>之间的关系。<br /><font color="#339966" size="3"><strong>[具体表现]<br /></strong></font>与关联关系一样，聚合关系也是通过<font color="#ff0000">实例变量</font>来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的，从<font color="#ff0000">语义</font>上才能<font color="#ff0000">更好的区分</font>两者的区别。<br /><font color="#339966" size="3"><strong>[关联与聚合的区别]</strong></font><br />(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系，而不是聚合关系，因为人不是由自行车组成的。<br />聚合关系涉及的两个对象处于不平等的层次上，一个代表整体，一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系，因为主板是电脑的组成部分。<br />(2)对于具有聚集关系（尤其是强聚集关系）的两个对象，整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在，它的生命周期依赖于整体类的对象的生命周期，当整体消失，部分也就随之消失。比如张三的电脑被偷了，那么电脑的所有组件也不存在了，除非张三事先把一些电脑的组件（比如硬盘和内存）拆了下来。<br /><font color="#339966" size="3"><strong>[UML图](图1.4)</strong></font><br /><strong><img alt="" src="http://seagar.javaeye.com/upload/picture/pic/1326/7032798b-36ca-4b89-a462-97ba056cbe48.jpg" /><br /><font face="Arial"><strong><font color="#339966">图1.3 </font><font color="#000000">电脑和组件的聚合关系</font></strong></font><br /><br /><font face="Arial"><font color="#339966" size="3"><strong>[代码表现]</strong></font></font></strong><div class="dp-highlighter"><div class="bar"><strong></strong></div><ol class="dp-j"><li class="alt"><span><span class="keyword">public</span><strong><span> </span><span class="keyword">class</span><span> Computer{   </span></strong></span><strong></strong></li><li class=""><strong><span>    </span><span class="keyword">private</span><span> CPU cpu;   </span></strong></li><li class="alt"><strong><span>    </span><span class="keyword">public</span><span> CPU getCPU(){   </span></strong></li><li class=""><strong><span>        </span><span class="keyword">return</span><span> cpu;   </span></strong></li><li class="alt"><strong><span>    }   </span></strong></li><li class=""><strong><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setCPU(CPU cpu){   </span></strong></li><li class="alt"><strong><span>        </span><span class="keyword">this</span><span>.cpu=cpu;   </span></strong></li><li class=""><strong><span>    }   </span></strong></li><li class="alt"><strong><span>    </span><span class="comment">//开启电脑 </span><span>  </span></strong></li><li class=""><strong><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> start(){   </span></strong></li><li class="alt"><strong><span>        </span><span class="comment">//cpu运作 </span><span>  </span></strong></li><li class=""><strong><span>        cpu.run();   </span></strong></li><li class="alt"><strong><span>    }   </span></strong></li><li class=""><strong><span>}  </span></strong></li></ol></div><br /><br /><font face="Arial" color="#99cc00"><strong>[参考资料]<br />1.《Java与模式》(阎宏 编著) 第2章 统一建模语言UML简介</strong></font></font>
		<br />
		<br />
		<br />补充：<br />1.类之间的关系一般分为四种：关联，依赖，泛化，实现； <br />而聚合和组合只是一种特殊的关联关系； <br />另外，关联，泛化和实现严格来说也都是依赖关系；<br /><br />而楼主把实现归为泛化关系中了，这是不对的；<br />泛化对应extends；实现对应implements；对应java语法就很好理解； 
<p>参考资料：<br />《UML参考手册》：第四章 4.3关系 36页 05年8月出版；<br />《UML用户指南》：<br />97页中说：<br />“泛化、关联，甚至包括实现其实都是某种依赖，只不过它们本身有足够重要的语义。如果你先对泛化、关联和实现建模，然后把所有其他关系都看作是依赖，你就不会犯错误。”<br /><br />101页（高级关系一章）中说：<br />“Aggregation/Composition 聚合/组合 只是 Association 关联 的一种修饰，一种高级用法，用于细节建模（组合表示一种强拥有的聚合，整体与部分的生命周期一致）。”<br /><br />（参考：<a href="http://www.umlchina.com/best/g24/u1127470.htm">http://www.umlchina.com/best/g24/u1127470.htm</a>）<br /><br />2.给上述文章补充一个实现的例子：<br /><img height="262" alt="图 10：Professor类和Student类实现Person接口的类图实例" src="http://www-128.ibm.com/developerworks/cn/rational/rationaledge/content/feb05/bell/bell_fig10.gif" width="325" border="0" /><br />（不过，应该给接口和实现都加上getEmail，getTel之类的方法，这样才更好的体现接口的含义；图和java代码有待自己完善。）<br /><br />3.补充组合的例子和uml图（实心）：<br />组合关系的uml图：<br />先画聚合关系，－》“open specification”－》“by value”；<br />这时聚合关系的图形就变成实心的了；</p><img src ="http://www.blogjava.net/flysky19/aggbug/86524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flysky19/" target="_blank">不断前进的小乌龟</a> 2006-12-09 12:08 <a href="http://www.blogjava.net/flysky19/articles/86524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>