﻿<?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-hoojo-随笔分类-UML</title><link>http://www.blogjava.net/hoojo/category/53783.html</link><description>学习在于积累：滴水可以石穿！学而不思则罔，思而不学则殆！ </description><language>zh-cn</language><lastBuildDate>Fri, 30 Aug 2013 10:53:42 GMT</lastBuildDate><pubDate>Fri, 30 Aug 2013 10:53:42 GMT</pubDate><ttl>60</ttl><item><title>软件设计之UML&amp;mdash;UML的构成[上]</title><link>http://www.blogjava.net/hoojo/archive/2013/08/30/uml_example.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Fri, 30 Aug 2013 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2013/08/30/uml_example.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/403508.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2013/08/30/uml_example.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/403508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/403508.html</trackback:ping><description><![CDATA[<h4>&nbsp;</h4> <blockquote> <p>UML是一种通用的建模语言，其表达能力相当的强，不仅可以用于软件系统的建模，而且可用于业务建模以及其它非软件系统建模。UML综合了各种面向对象方法与表示法的优点，至提出之日起就受到了广泛的重视并得到了工业界的支持。  <p>本章将按视图、模型元素、图以及公共机制依次介绍UML的构造和基本元素，以使得读者对UML有一个总体了解，其具体细节将在后续章节中详细描述。</p></blockquote> <p>&nbsp; <blockquote> <p>画图工具：eDraw、jude</p> <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_14.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_thumb_6.png" width="49" height="37"></a>&nbsp; <a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_12.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_thumb_5.png" width="57" height="40"></a> </p> <p>欢迎大家继续支持和关注我的博客：  <p><a href="http://hoojo.cnblogs.com">http://hoojo.cnblogs.com</a>  <p><a href="http://blog.csdn.net/IBM_hoojo">http://blog.csdn.net/IBM_hoojo</a>  <p>也欢迎大家和我交流、探讨IT方面的知识。</p> <p>email：<a href="mailto:hoojo_@126.com">hoojo_@126.com</a></p></blockquote> <blockquote> <p>如果你觉得本文不错的话，请你点击屏幕右下方的<a href="http://images.cnitblog.com/blog/151517/201303/04131459-b5e7ffa7d93d4db097ac43495d140767.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131459-4ab482a2940a43f1ad7689a666a85337.png" width="61" height="40"></a> 。如果你以后会用到这篇文章的或觉得以后要重新翻阅的话，你可以点击屏幕右下角的<a href="http://images.cnitblog.com/blog/151517/201303/04131459-170eb3195b264d44b13b76fc2f8b38aa.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131500-eee2e943e40544c69c8825ee4eaa229c.png" width="53" height="30"></a> 。如果你觉得我的博文不错或是想在第一时间看到我的动态的话，你可以点击屏幕右下角<a href="http://images.cnitblog.com/blog/151517/201303/04131500-f079e2fbbaa2438fb8cd86b0d8c1bac9.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131500-8dfeee58e7824599a7b98a87bb922853.png" width="59" height="34"></a> 。如果你想说点什么的话，你可以点击屏幕右下方的<a href="http://images.cnitblog.com/blog/151517/201303/04131500-67a1c2a43ca84b9d8b866cc8816f760b.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131501-897ee78fba6341429702fcd7aa6af25b.png" width="56" height="36"></a> 。如果你都点过了，那真的太谢谢你了，兄弟太支持了。此时，或许你可以点击<a href="http://images.cnitblog.com/blog/151517/201303/04131501-d8ed150ca9c84d58a6ad012bf076a901.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131501-f0529fd427cd476bbc4fa13bf1a5e7a8.png" width="55" height="38"></a> 按钮，然后看看博文的导航继续浏览其他文章。</p></blockquote> <p>&nbsp;</p> <p><a name="OLE_LINK49"></a><a name="OLE_LINK48"></a><a name="OLE_LINK47"><font size="4"><b>1. </b><b>UML</b></font></a><b><font size="4">的组成</font></b><b></b>  <blockquote> <p>UML由视图(View)、图(<a name="OLE_LINK9"></a><a name="OLE_LINK8"></a><a name="OLE_LINK7">Diagram</a>)、<a name="OLE_LINK13"></a><a name="OLE_LINK12"></a><a name="OLE_LINK11"></a><a name="OLE_LINK10">模型元素</a>(Model Element)和<a name="OLE_LINK14">通用机制</a>(General Mechanism)等几个部分组成。  <p>a) 视图(View)： 是表达系统的某一方面的特征的UML建模元素的子集，由多个图构成，是在某一个抽象层上，对系统的抽象表示。  <p>b) 图(Diagram)： 是模型元素集的图形表示，通常是由弧（关系）和顶点（其他模型元素）相互连接构成的。  <p>c) 模型元素(Model Element)：代表面向对象中的类、对象、消息和关系等概念，是构成图的最基本的常用概念。  <p>d) 通用机制(General Mechanism)：用于表示其他信息，比如注释、模型元素的语义等。另外，UML还提供扩展机制，使UML语言能够适应一个特殊的方法（或过程），或扩充至一个组织或用户。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/uml%20%E6%9E%84%E6%88%90_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="uml 构成" border="0" alt="uml 构成" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/uml%20%E6%9E%84%E6%88%90_thumb.png" width="794" height="514"></a></p></blockquote> <p>&nbsp; <p><a name="OLE_LINK19"><font size="4"><b>2. </b><b>UML</b></font></a><b><font size="4">视图的分类</font></b><b></b>  <blockquote> <p>UML是用来描述模型的，用模型来描述系统的机构或静态特征，以及行为或动态特征。从不同的视角为系统构架建模，形成系统的不同视图。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_thumb.png" width="442" height="438"></a>  <p><a name="OLE_LINK21"></a><a name="OLE_LINK20"><strong>(1) 用例视图</strong></a><strong>(Use Case View)，</strong>强调从用户的角度看到的或需要的系统功能，是被称为参与者的外部用户所能观察到的系统功能的模型图。  <p><a name="OLE_LINK22"><strong>(2) 逻辑视图</strong></a><strong>(Logical View)，</strong>展现系统的静态或结构组成及特征，也称为结构模型视图(Structural Model View)或静态视图(Static View)。  <p><a name="OLE_LINK23"><strong>(3) 并发视图</strong></a><strong>(Concurrent View)，</strong>体现了系统的动态或行为特征，也称为行为模型视图(Behavioral Model View)或动态视图(Dynamic View)。  <p><a name="OLE_LINK25"></a><a name="OLE_LINK24"><strong>(4) 组件视图</strong></a><strong>(Component View)，</strong>体现了系统实现的结构和行为特征，也称为实现模型视图(Implementation Model View)。  <p><a name="OLE_LINK27"></a><a name="OLE_LINK26"><strong>(5) 配置视图</strong></a><strong>(Deployment View)，</strong>体现了系统实现环境的结构和行为特征，也称为环境模型视图(Environment Model View)或物理视图(Physical View)。  <p>&nbsp; <p><a name="OLE_LINK28"><b>视图是由图组成</b></a><b>的，</b><b>UML</b><b>提供</b><b>9</b><b>种不同的图：</b><b></b>  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_thumb_1.png" width="495" height="306"></a>  <p><a name="OLE_LINK31"></a><a name="OLE_LINK30"></a><a name="OLE_LINK29">(1) 用例图</a>(Use Case Diagram)，描述系统功能；  <p>(2) 类图(Class Diagram)，描述系统的静态结构；  <p>(3) 对象图(Object Diagram)，描述系统在某个时刻的静态结构；  <p>(4) 组件图(Component Diagram)，描述了实现系统的元素的组织；  <p>(5) 配置图(Deployment Diagram)，描述了环境元素的配置，并把实现系统的元素映射到配置上；  <p>(6) 状态图(State Diagram)，描述了系统元素的状态条件和响应；  <p>(7) 时序图(Sequence Diagram)，按时间顺序描述系统元素间的交互；  <p>(8) 协作图(Collaboration Diagram)，按照时间和空间顺序描述系统元素间的交互和它们之间的关系；  <p>(9) 活动图(Activity Diagram)，描述了系统元素的活动；  <p>建模方法由<b>建模语言和建模过程</b>两部分构成。其中建模语言是用来表述设计方法的表示法，建模过程是对设计中所应采取的步骤的描述。UML是一种建模语言，它在很大程度上独立于建模过程。在实际建模中，建模人员最好把UML用于以用案驱动的、以体系机构为中心的、迭代的和渐增式的开发过程中。  <p>一般而言，软件系统的体系结构给出了软件系统的组织、组成系统的构造元素及其接口的选择、系统的行为和体系结构风格等信息。也就是说，它不仅关心系统的结构和行为等功能性需求，而且也涉及系统的性能、易理解性、易复用性等非功能性需求。如下图所示，UML利用用户模型视图、结构模型视图、行为模型视图、实现模型视图和环境模型视图来描述软件系统的体系结构。  <p><b></b> <p><b>根据它们在不同架构视图的应用，可以把</b><b>9</b><b>种图分成：</b><b></b>  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_thumb_2.png" width="483" height="302"></a>  <p><a name="OLE_LINK34"></a><a name="OLE_LINK33"></a><a name="OLE_LINK32">(1) 用户模型视图：用例图；</a>  <p>(2) 结构模型视图：类图和对象；  <p>(3) 行为模型视图：状态图、时序图、协作图和活动图（动态图）；  <p>(4) 实现模型视图：组件图；  <p>(5) 环境模型视图：配置图。  <p><b>用户模型视图</b>由专门描述<b>最终用户、分析人员和测试人员</b>看到的系统行为的用案组成，它实际上是<b>从用户角度</b>来描述系统应该具有的功能。用户模型视图所描述的系统功能依靠外部用户或者另外一个系统来激活，为用户或者另一系统提供服务，从而实现用户或另一系统与系统的交互。系统实现的最终目标是提供用户模型视图中所描述的功能。在UML中，<b>用户模型视图是由用案图组成</b>。  <p><b>结构模型视图</b>描述组成系统的<b>类、对象以及它们之间的关系</b>等静态结构，用来支持系统的功能需求，即描述系统内部功能是如何设计的。结构模型视图由<b>类图和对象图</b>构成，<b>主要供设计人员和开发人员使用</b>。  <p><b>行为模型视</b>图主要用来描述形成<b>系统并发与同步机制的线程和进程</b>，其关注的重点是系统的性能、易伸缩性和系统的吞吐量等非功能性需求。行为模型视图利用并发来描述资源的高效使用、并行执行和处理异步事件。除了讲系统划分为并发执行的控制线程之外，行为模型还必须处理通信和这些线程及进程之间的同步问题。行为模型视图主要供<b>系统开发人员和系统集成人员</b>使用，它由<b>序列图、协作图、状态图和活动图</b>组成。  <p><b>实现模型视图</b>用来描述系统的实现模块它们之间的依赖关系以及资源分配情况。这种视图主要用于系统的配置管理，它是由一些独立的构件组成的。实现模型视图由<b>构件图组成</b>。其中构件是代码模块，不同类型的代码模块形成不同的构件。实现模型视图主要供<b>开发人员</b>使用。  <p><b>环境模型视图</b>用来描述物理系统的<b>硬件拓扑结构</b>。例如，系统中的计算机和设备的分布情况以及它们之间的连接方式，其中计算机和设备统称为节点。在UML中环境模型视图是由部署图来表示的。系统部署图描述了系统构件在节点上的分布情况，即用来描述软件构件到物理节点的映射。部署图主要供<b>开发人员、系统集成人员和测试人员</b>使用。  <p>上面每一种视图反映了系统的一个特定方面，不同人员可以单独的使用其中每一种视图，从而可以关注特定的体系结构问题。但在通常情况下，由于系统的最终目标是提供用户模型视图中描述的功能以及其它一些非功能性需求，因此，用户模型视图是其它视图的核心基础，其它视图的构造都依赖与用户模型视图中所描述的类容。  <p>细心的读者已经发现，每一种UML图都是由多个图组成的，每一种图都是体系结构某个侧面的表示，各种图实际上是一致的，所有的图在一起组成了系统的完整视图。如下图所示，UML中总共提供了用案图、类图、对象图、序列图、协作图、状态图、活动图、构建图和部署图9种图。根据它们描述的是系统的静态结构还是动态行为，可以将它们分为静态图和动态图两类。再进一步介绍这9中UML图时，先了解下什么是模型元素：  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_8.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/image_thumb_3.png" width="350" height="264"></a> </p></blockquote> <p><b></b>&nbsp; <p><font size="4"><b>3. </b><b>UML</b><b>的建模机制</b></font><b></b>  <blockquote> <p>UML有两套建模机制：静态建模机制和动态建模机制。静态建模机制包括用例图、类图、对象图、包、组件图和配置图。动态建模机制包括状态图、时序图、协作图、活动图。  <p>(1) 用例图：用例的可视化工具，它提供计算机系统的高层次的用户视图，表示以外部活动者的角度来看系统将是怎样使用的。  <p>用例图（用案图）是用于描述一组用案，参与者以及它们之间的连接关系。一个用案图描述了一组动作序列，每一个序列表示系统的外部设施（系统的参与者）与系统本身的交互。从一个特定参与者的角度看，一个用案完成对其有价值的工作。如图2.5所示，用案图仅仅是从参与者使用系统的角度来描述系统中的信息，即站在系统外部查看系统应该具有什么功能，而并不描述该功能在软件内部是如何实现的。用案可以应用于整个系统，也可以应用于系统的一个部分，包括子系统、单个的类或者接口。通常，用案不仅代表这些元素所期望的行为，而且还可以把这些元素用作开发过程中测试用案的基础。  <p>用例图包括以下3方面内容：  <p>(a) 用例(Use Case)  <p>(b) 参与者(Actor)  <p>(c) 依赖、泛化和关联关系  <p>用例图示例：  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image012_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image012_thumb.jpg" width="558" height="301"></a>  <p>(2) 类图：描述类、接口、协作以及它们之间关系的图。  <p>类图是用于描述一组类、接口、协作以及它们之间的静态关系。在面向对象系统的建模中，类图是最为常用的图，它用来阐明系统的静态结构。事实上类是对一组具有相同属性、操作、关系和语义的对象的描述，其中对类的属性和操作进行描述时的一个最重要的细节就是它的可见性。  <p>类可以以多种形式连接，例如关联、泛化、依赖和实现等。一个典型的系统中通常有若干个类图。一个类图不一定要包含系统中所有的类，一个类可以加到几个类图中。  <p>类图示例：  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image014_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image014_thumb.jpg" width="557" height="392"></a>  <p>(3) 对象图：表示在某一时间上一组对象以及它们之间的关系的图。对象图可以被看做是类图在系统某一时刻的实例。  <p>对象图是类图的实例，用来描述特定运行时刻一组对象之间的关系。也就是说，对象用于描述交互的静态部分，它由参与协作的有关对象组成。但不包括在对象之间传递的任何消息。  <p>在创建对象图时，建模人员并不需要用单个的对象图来描述系统中的每一个对象。事实上，绝大多数系统中都会包含成百上千的对象。用对象来描述系统的所有对象以及它们之间的关系一般是不太现实的。因此，建模人员可以选择所感兴趣的对象极其之间的关系来描述。  <p>对象图中所使用的符号和类图中使用的符号几乎完全相同，区别仅在于对象图的对象名带有下划线，而且类与类之间关系的所有的实例都要画出来。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image016_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image016_thumb.jpg" width="558" height="363"></a>  <p><a name="OLE_LINK44">(4) 组件图</a>：描述软件组件以及组件之间的关系，组件本身是代码的物理模块，组件图则显示了代码的结构。  <p>组件图（构件图）是用于描述一组构件之间的组织和依赖关系，用于建模系统的静态实现视图。构件可以是可执行程序集、库、表、文件和文档等，它包含了逻辑类或者逻辑类的实现信息，因此结构模型视图和实现模型视图之间存在映射关系。  <p>构建图中也可以包括包或子系统，它们都是用于将模型元素组成较大的组块。  <p>组件图例图：  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/OrderComponent_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="OrderComponent" border="0" alt="OrderComponent" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/OrderComponent_thumb.png" width="766" height="704"></a>  <p><a name="OLE_LINK46"></a><a name="OLE_LINK45">(5) 配置图</a>：描述系统硬件的物理拓扑结构以及在此结构上执行的软件。配置图可以显示计算节点的拓扑结构和通信路径、结点上运行的软件组件、软件组件包含的逻辑单元（对象、类）等。配置图常常用于帮助理解分布式系统。  <p>配置图（部署图）用来描述系统运行是进行处理的节点以及在节点上活动的构件的配置。部署图用来对系统的环境模型视图进行建模。在大多数情况下，部署图用来描述系统硬件的扩普结构。  <p>在UML中，建模人员可以用类图来描述系统的静态结构，可以用序列图、协作图、状态图、活动图来描述系统的动态行为，而用部署图来描述软件所执行所需的处理器和设备的拓扑结构。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/%E9%83%A8%E7%BD%B2%E5%9B%BE%E9%85%8D%E7%BD%AE%E5%9B%BE_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="部署图配置图" border="0" alt="部署图配置图" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/%E9%83%A8%E7%BD%B2%E5%9B%BE%E9%85%8D%E7%BD%AE%E5%9B%BE_thumb.png" width="797" height="432"></a>  <p>(6) 状态图：通过类对象的生命周期建立模型来描述对象随时间变化的动态行为。  <p>状态图实际上是一种由状态、变迁、事件和活动组成的状态机。状态图描述从状态到状态的控制流，常用于系统的动态特性建模。在大多数情况下，它用来对反应型对象的行为建模。  <p>在UML中，状态图可以用来对一个对象按事件排序的行为建模。一个状态图是强调从状态到状态的控制流的状态机的简单表示。一般而言，状态图是对类所描述的设施的补充说明，它描述了类的所有对象可能具有的状态以及引起状态变化的事件。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/OrderState_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="OrderState" border="0" alt="OrderState" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/OrderState_thumb.png" width="795" height="577"></a>  <p>(7) 时序图：交互图描述了一个交互，它由一组对象和它们之间的关系组成，并且还包括在对象间传递的信息。交互图表达对象之间的交互，是描述一组对象如何协作完成某个行为的模型化工具。  <p>序列图和协作图统称为交互图。其中，序列图用来描述对象之间消息发送的先后次序，阐明对象之间的交互过程以及在系统执行过程中的某一具体时刻将会发生什么事件。序列图是一种强调时间顺序的交互图，其中对象沿横轴方向排列，消息沿纵轴方向排列。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/Product-seq%5B6%5D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Product-seq[6]" border="0" alt="Product-seq[6]" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/Product-seq%5B6%5D_thumb.png" width="788" height="346"></a>  <p>序列图中的对象生命线是一条垂直的虚线，它表示一个对象在一段时间内存在。由于序列图中大多数对象都存在于整个交互过程中，因此这些对象全部排列在图的顶部，它们的生命线从图的顶部画到图的底部。每个对象的下方有一个矩形条，它与对象的生命线重叠，它表示该对象的控制焦点。序列图中的消息可以有序号，但由于这种图上的消息已经从纵轴上按时间顺序排序，因此消息序号通常予以省略。  <p>(8) 协作图：包含类元角色和关联角色，而不仅仅是类元和关联。协作图强调参加交互的各对象的组织。协作图只对相互间有交互作用的对象和这些对象间的关系建模，而忽略了其他对象和关联。协作图也是一种交互图，它强调收发消息的对象的组织结构。  <p>协作图和序列图是协作的，它们可以互相转换。在多数情况下，协作图主要对单调的、顺序的控制流建模，但它也可以用来对包括迭代和分支在内的复杂控制流进行建模。  <p>一般而言，建模人员可以创建多个协作图，其中一些是主要的，另外一些是可选择的路径或者异常条件。建模人员可以用包来组织这些协作图，并给每个图起一个合适的名字，以便与其它图区别开。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image026_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image026" border="0" alt="clip_image026" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/clip_image026_thumb.jpg" width="558" height="294"></a>  <p>(9) 活动图：用于展现参与行为的类的活动或动作。  <p>活动图是状态图的一种特殊情况，其中几乎所有或大多数状态都处于活动状态，而且几乎所有或者大多数变迁都是由源状态中活动的完成触发的。活动图本质上是一种流程图，它描述了从活动到活动的控制流。  <p>可以把活动图看作是新样的交互图，但交互图观察的是传递消息的对象，而活动图观察到的是对象之间传送的消息。尽管两者在语义上的区别很细微，但它们使用不同的方式来看系统的。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/GoShopping_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="GoShopping" border="0" alt="GoShopping" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_E9F6/GoShopping_thumb.png" width="796" height="643"></a></p></blockquote> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <blockquote> <p>如果你觉得本文不错的话，请你点击屏幕右下方的<a href="http://images.cnitblog.com/blog/151517/201303/04131459-b5e7ffa7d93d4db097ac43495d140767.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131459-4ab482a2940a43f1ad7689a666a85337.png" width="61" height="40"></a> 。如果你以后会用到这篇文章的或觉得以后要重新翻阅的话，你可以点击屏幕右下角的<a href="http://images.cnitblog.com/blog/151517/201303/04131459-170eb3195b264d44b13b76fc2f8b38aa.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131500-eee2e943e40544c69c8825ee4eaa229c.png" width="53" height="30"></a> 。如果你觉得我的博文不错或是想在第一时间看到我的动态的话，你可以点击屏幕右下角<a href="http://images.cnitblog.com/blog/151517/201303/04131500-f079e2fbbaa2438fb8cd86b0d8c1bac9.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131500-8dfeee58e7824599a7b98a87bb922853.png" width="59" height="34"></a> 。如果你想说点什么的话，你可以点击屏幕右下方的<a href="http://images.cnitblog.com/blog/151517/201303/04131500-67a1c2a43ca84b9d8b866cc8816f760b.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131501-897ee78fba6341429702fcd7aa6af25b.png" width="56" height="36"></a> 。如果你都点过了，那真的太谢谢你了，兄弟太支持了。此时，或许你可以点击<a href="http://images.cnitblog.com/blog/151517/201303/04131501-d8ed150ca9c84d58a6ad012bf076a901.png"><img title="image" border="0" alt="image" src="http://images.cnitblog.com/blog/151517/201303/04131501-f0529fd427cd476bbc4fa13bf1a5e7a8.png" width="55" height="38"></a> 按钮，然后看看博文的导航继续浏览其他文章。</p></blockquote> <blockquote> <p>最后，欢迎大家继续支持和关注我的博客：  <p><a href="http://hoojo.cnblogs.com">http://hoojo.cnblogs.com</a>  <p><a href="http://blog.csdn.net/IBM_hoojo">http://blog.csdn.net/IBM_hoojo</a>  <p>也欢迎大家和我交流、探讨IT方面的知识。</p></blockquote>  <img src ="http://www.blogjava.net/hoojo/aggbug/403508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2013-08-30 16:52 <a href="http://www.blogjava.net/hoojo/archive/2013/08/30/uml_example.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件设计之UML&amp;mdash;UML中的六大关系</title><link>http://www.blogjava.net/hoojo/archive/2013/08/01/402264.html</link><dc:creator>hoojo</dc:creator><author>hoojo</author><pubDate>Thu, 01 Aug 2013 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/hoojo/archive/2013/08/01/402264.html</guid><wfw:comment>http://www.blogjava.net/hoojo/comments/402264.html</wfw:comment><comments>http://www.blogjava.net/hoojo/archive/2013/08/01/402264.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/hoojo/comments/commentRss/402264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hoojo/services/trackbacks/402264.html</trackback:ping><description><![CDATA[<h4>一、UML中的六大关系</h4> <blockquote> <p>在UML类图中，常见的有以下几种关系: 泛化（Generalization）, 实现（Realization），关联（Association)，聚合（Aggregation），组合(Composition)，依赖(Dependency)。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/image_thumb.png" width="367" height="284"></a> </p></blockquote> <blockquote> <p>1.1、 继承关系—泛化（Generalization）  <p>指的是一个类（称为子类、子接口）继承另外的一个类（称为父类、父接口）的功能，并可以增加它自己的新功能的能力，继承是类与类或者接口与接口之间最常见的关系；在Java中用extends关键字。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image001_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image001_thumb.png" width="406" height="199"></a>  <p>【泛化关系】是一种继承关系，表示一般与特殊的关系，它指定了子类如何特化父类的所有特征和行为。例如：猫头鹰是鸟的一种，即有鸟的特性也有猫头鹰的共性。  <p>【箭头指向】带三角箭头的实线，箭头指向父类。  <p>【描述】上图中的类bird有嘴、翅膀、羽毛等属性。会飞、会唧唧喳喳的叫，那么就有这些方法。而猫头鹰有大眼睛和捕捉老鼠的本领，这则是自身的特性。</p></blockquote> <blockquote> <p>1.2、 实现关系（Realization）  <p>指的是一个class类实现interface接口（可以是多个）的功能；实现是类与接口之间最常见的关系；在Java中此类关系通过关键字implements明确标识。  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image003_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image003_thumb.jpg" width="322" height="155"></a>  <p>【实现关系】是一种类与接口的关系，表示类是接口所有特征和行为的实现.  <p>【箭头指向】带三角箭头的虚线，箭头指向接口。  <p>【描述】上图中IFly是一个接口，接口中有时间、速度等常量，还有一个fly方法。FlyImpl继承了这个IFly接口后，需要实现fly方法，同时实现类也可以拥有自己的属性和方法。</p></blockquote> <blockquote> <p>1.3、 依赖（Dependency）  <p>可以简单的理解，就是一个类A使用到了另一个类B，而这种使用关系是具有偶然性的、临时性的、非常弱的，但是B类的变化会影响到A；比如某人要过河，需要借用一条船，此时人与船之间的关系就是依赖；表现在代码层面，为类B作为参数、属性被类A在某个method方法中使用；  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image005_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image005_thumb.jpg" width="300" height="351"></a>  <p>【依赖关系】是一种使用的关系，即一个类的实现需要另一个类的协助，所以要尽量不使用双向的互相依赖。  <p>【代码表现】局部变量、方法的参数或者对静态方法的调用  <p>【箭头及指向】带箭头的虚线，指向被使用者  <p>【描述】Bird类中有一个setFly方法，它需要使用者用到IFly接口的实现，那么这种关系就是依赖关系。</p></blockquote> <blockquote> <p>1.4、 关联  <p>他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系，比如我和我的朋友；这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的，一般是长期性的，而且双方的关系一般是平等的、关联可以是单向、双向的；表现在代码层面，为被关联类B以类属性的形式出现在关联类A中，也可能是关联类A引用了一个类型为被关联类B的全局变量；  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image007_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image007_thumb.jpg" width="230" height="259"></a>  <p>【关联关系】是一种拥有的关系，它使一个类知道另一个类的属性和方法；如：老师与学生，丈夫与妻子关联可以是双向的，也可以是单向的。双向的关联可以有两个箭头或者没有箭头，单向的关联有一个箭头。  <p>【代码体现】成员变量  <p>【箭头及指向】带普通箭头的实心线，指向被拥有者  <p>【描述】在Bird类中有一个IFly类型的fly属性，需要提供IFly的接口实现。Bird对象会利用IFly接口的实现完成fly方法。</p> <p><a name="OLE_LINK4">1.4.1</a>、双向关联 <p>双方都知道对方的存在，都可以调用对方的公共属性、方法。 <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image002_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image002_thumb.jpg" width="334" height="127"></a> <p><a name="OLE_LINK3"></a><a name="OLE_LINK2">【关联关系】双方都有关联的关系，通过自身对对方关联的属性来访问对方的属性和方法。</a> <p>【代码体现】成员变量 <p>【箭头及指向】用不带箭头的实线连接双方 <p>【描述】在中国一个妻子只能嫁给一个丈夫，一个丈夫也只能取一个妻子。 <p>1.4.2、自身关联 <p>自己关联自己，这种情况比较少出现但是也有用到。 <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image004_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image004_thumb.jpg" width="128" height="109"></a> <p>【自关联关系】双方都有关联的关系，通过自身对自身关联的属性引用来访问对方的属性和方法。 <p>【代码体现】成员变量 <p>【箭头及指向】用带普通箭头的实线连接自己 <p>【描述】在盗梦空间中，演员需要在梦中再造梦，这种梦中梦的情况跟上图描述很符合。 <p>&nbsp;</p> <p>1.5、 聚合（Aggregation） </p></blockquote> <blockquote> <p>聚合是关联关系的一种特例，他体现的是整体与部分、拥有的关系，即has-a的关系，此时整体与部分之间是可分离的，他们可以具有各自的生命周期，部分可以属于多个整体对象，也可以为多个整体对象共享；比如计算机与CPU、公司与员工的关系等；表现在代码层面，和关联关系是一致的，只能从语义级别来区分；  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image009_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image009_thumb.jpg" width="309" height="204"></a>  <p>【聚合关系】是整体与部分的关系，且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系，轮胎离开车仍然可以存在。聚合关系是关联关系的一种，是强的关联关系；关联和聚合在语法上无法区分，必须考察具体的逻辑关系。  <p>【代码体现】成员变量  <p>【箭头及指向】带空心菱形的实心线，菱形指向整体  <p>【描述】birdChild一只鸟有很多鸟宝宝，所以自引用。鸟有很多不同数量和颜色的羽毛，所以引用关系是0~*。</p></blockquote> <blockquote> <p>1.6、 组合（Composition）  <p>组合也是关联关系的一种特例，他体现的是一种contains-a的关系，这种关系比聚合更强，也称为强聚合；他同样体现整体与部分间的关系，但此时整体与部分是不可分的，整体的生命周期结束也就意味着部分的生命周期结束；比如你和你的大脑；表现在代码层面，和关联关系是一致的，只能从语义级别来区分；  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image011_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image011" border="0" alt="clip_image011" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image011_thumb.jpg" width="283" height="72"></a>  <p>【组合关系】是整体与部分的关系，但部分不能离开整体而单独存在。如公司和部门是整体和部分的关系，没有公司就不存在部门。组合关系是关联关系的一种，是比聚合关系还要强的关系，它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。  <p>【代码体现】成员变量  <p>【箭头及指向】带实心菱形的实线，菱形指向整体  <p>【描述】一个学校由多个班级组成，班级离开学校也就不存在、而学校离开班级也不成立。像这种不可分离的关系就需要用组合。</p></blockquote> <blockquote> <p>综合示例  <p><a href="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image013_2.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image013" border="0" alt="clip_image013" src="http://www.blogjava.net/images/blogjava_net/hoojo/WindowsLiveWriter/UMLUML_DF09/clip_image013_thumb.jpg" width="517" height="504"></a>  <p>对于继承、实现这两种关系没多少疑问，他们体现的是一种类与类、或者类与接口间的纵向关系；其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系，是比较难区分的，有很多事物间的关系要想准备定位是很难的，前面也提到，这几种关系都是语义级别的，所以从代码层面并不能完全区分各种关系；但总的来说，后几种关系所表现的强弱程度依次为：泛化 = 实现 &gt; 组合 &gt; 聚合 &gt; 关联 &gt; 依赖。</p></blockquote><img src ="http://www.blogjava.net/hoojo/aggbug/402264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hoojo/" target="_blank">hoojo</a> 2013-08-01 16:17 <a href="http://www.blogjava.net/hoojo/archive/2013/08/01/402264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>