﻿<?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-joe --专注java,开源,架构,项目管理-随笔分类-UML</title><link>http://www.blogjava.net/freeman1984/category/48926.html</link><description>         
        STANDING ON THE SHOULDERS OF GIANTS</description><language>zh-cn</language><lastBuildDate>Mon, 27 Jun 2011 03:28:50 GMT</lastBuildDate><pubDate>Mon, 27 Jun 2011 03:28:50 GMT</pubDate><ttl>60</ttl><item><title>UML用例图</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/25/332818.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Sat, 25 Sep 2010 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/25/332818.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/332818.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/25/332818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/332818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/332818.html</trackback:ping><description><![CDATA[<span>前些时间参加了潘加宇老师的技术讲座，</span><span>UML</span><span>建模技术受益匪浅。我也把平时的一些积累和上次的收获总结在这篇文章中，主要讲解用例图相关的知识。</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>用例图是软件需求分析到最终实现的第一步，它描述用户如何使用系统及使用系统什么样的功能。用例图从业务角度上体现谁来使用系统、用户希望系统提供什么样的服务，以及用户需要为系统提供的服务，也便于软件开发人员最终实现这些功能。用例图在开发中被广泛的应用，但是它最常用来描述系统提供了什么样的功能给什么样的用户使用。</span><span><br />
</span>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>在官方文档中用例图包含六个元素，分别是：执行者</span><span>(Actor)</span><span>、用例</span><span>(Use Case)</span><span>、关联关系</span><span>(Association)</span><span>、包含关系</span><span>(Include)</span><span>、扩展关系</span><span>(Extend)</span><span>以及泛化关系</span><span>(Generalization)</span><span>。但是有些</span><span>UML</span><span>的绘图工具多提供了一种直接关联关系</span><span>(DirectedAssociation)</span><span>。</span><span><br />
</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>用例图可一个包含注释和约束，还可一个包含包，用于将模型中的元素组合成更大的模块。有时，可以将用例的实例引入到图中。用例图模型如下所示，执行者用人形图标来标识，用例用椭圆来表示，连线表示它们之间的关系。</span><span><br />
</span></span></p>
<p>&nbsp;<br />
&nbsp;</p>
<p><span><strong><span>一、执行者（</span><span>Actor</span><span>）</span></strong><span><br />
</span></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span> 1</span><span>、执行者概念</span><span><br />
</span></strong></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>是指用户在系统中扮演的角色。如图</span><span>1-1</span><span>是一个用户管理的用例图，图中的用户、管理员就是用例的执行者。</span><span><br />
</span></span></p>
<p><img alt="" src="http://www.alisdn.com/wordpress/wp-content/uploads/2009/03/030609-0708-uml1.png" /><span><br />
</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>图</span><span>1-1<br />
</span></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</span><span>、从业务中找出执行者</span><span><br />
</span></strong></span></p>
<p><span><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><span>获取系统用例首先要找出系统的执行者。我们可以通过用户回答一些问题的答案来识别执行者。可以参考以下问题：<br />
</span></span></p>
<ol>
    <li><span>谁使用系统的主要功能（主要使用者）？<br />
    </span></li>
    <li><span>谁需要系统支持他们日常工作？<br />
    </span></li>
    <li><span>谁来维护、管理系统使其正常工作（辅助使用者）？<br />
    </span></li>
    <li><span>系统需要控制哪些硬件？<br />
    </span></li>
    <li><span>系统需要其他哪些系统交互？这里包含其他计算机系统或者应用程序。<br />
    </span></li>
    <li><span>对系统产生结果感兴趣的是哪些人和哪些事物？<br />
    </span></li>
</ol>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span><span>、执行者之间关系</span><span><br />
</span></strong></span></p>
<p><span><span>因为执行者是类，所以多个执行者之间可以具有与类相同的关系。在用例图中，使用了泛化关系来描述多个执行者之间的公共行为。如果系统中存在几个执行者，它们既扮演自身的角色，同时也扮演更具一般化的角色，那么就用泛化关系来描述它们。这种情况往往发生在一般角色的行为在执行者超类中描述的场合。特殊化的执行者继承了该超类的行为，然后在某些方面扩展了此行为。执行者之间的泛化关系用一个三角箭头来表示，指向扮演一般角色的超类。这与</span><span>UML</span><span>中类之间的返还关系符号相同。图1-2<br />
</span></span></p>
<p><img alt="" src="http://www.alisdn.com/wordpress/wp-content/uploads/2009/03/030609-0708-uml2.png" /><span><br />
</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>图1-2<br />
</span></span></p>
<p>&nbsp;</p>
<p><span><strong><span>二、用例（</span><span>Use Case</span><span>）</span></strong><span><br />
</span></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</span><span>、用例概念</span><span><br />
</span></strong></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>用例就是外部可见的系统功能，对系统提供的服务进行描述。</span><span><br />
</span></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</span><span>、从业务中找出用例</span><span><br />
</span></strong></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>找出系统的用例，我们从执行者入手，对每个执行者提出一些问题，然后从执行者对这些问题的答案中获取用例。可以参考以下问题：</span><span><br />
</span></span></p>
<ol>
    <li><span>执行者要求系统提供哪些功能（执行者需要做什么）？<br />
    </span></li>
    <li><span>执行者需要读、产生、修改、删除或者存储系统中的信息有哪些类型？<br />
    </span></li>
    <li><span>执行者必须提醒系统事件有哪些？把这些事件表示成系统用例。<br />
    </span></li>
</ol>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span><span>、用例之间关系</span></strong><span><br />
</span></span></p>
<p><span><strong><span>二、用例之间关系</span><span><br />
</span></strong></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1</span><span>、关联关系（</span><span>Association</span>）<br />
</strong></span></p>
<p><span><span>关联关系是连接执行者和用例，表示该执行者代表的外部系统实体与该用例描述的系统需求有关。</span><span><br />
</span></span></p>
<p><img alt="" src="http://www.alisdn.com/wordpress/wp-content/uploads/2009/03/030609-0708-uml3.png" /><span><strong><br />
</strong></span></p>
<p><span>图1-3<br />
</span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</span>、包含关系（<span>Include</span>）<br />
</strong></span></p>
<p><span>包含关系是来自于用例的抽象，即从数个不同的Use Case中，分离出公共的部分，而成为可以复用的用例。<br />
</span></p>
<p><img alt="" src="http://www.alisdn.com/wordpress/wp-content/uploads/2009/03/030609-0708-uml4.png" /><span><strong><br />
</strong></span></p>
<p><span><span>图</span><span>1-4<br />
</span></span></p>
<p><span><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span>、扩展关系（<span>Extend</span>）<br />
</strong></span></p>
<p><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong>扩展关系表示某一个用例的对话流程中，可能会根据条件临时插入另外一个用例，而前者称为基础用例后者称为扩展用例。<br />
</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.alisdn.com/wordpress/wp-content/uploads/2009/03/030609-0708-uml5.png" /><br />
</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图1-5<strong><br />
</strong></span></p>
<p><span><strong>4、泛化关系（<span>Generalization</span>）<br />
</strong></span></p>
<p><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong>一个用例可以被特别列举为一个或多个用例，这被称为用例泛化，如果系统中一个或多个用例是某个一般用例的特殊化时，就需要使用用例的泛化关系。<br />
</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.alisdn.com/wordpress/wp-content/uploads/2009/03/030609-0708-uml6.png" /><strong><br />
</strong></span></p>
 <img src ="http://www.blogjava.net/freeman1984/aggbug/332818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">@joe</a> 2010-09-25 14:22 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/25/332818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UML中几种类间关系：继承、实现、依赖、关联、聚合、组合的联系与区别</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/25/332815.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Sat, 25 Sep 2010 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/25/332815.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/332815.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/25/332815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/332815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/332815.html</trackback:ping><description><![CDATA[<p>&nbsp;转载自：<a href="http://blog.csdn.net/sfdev/archive/2009/02/18/3906243.aspx">http://blog.csdn.net/sfdev/archive/2009/02/18/3906243.aspx</a><br />
这是一堂关于UML基础知识的补习课；现在我们做项目时间都太紧了，基本上都没有做过真正的class级别的详细设计，更别提使用UML来实现规范建模了；本篇主要就以前自己一直感觉很迷糊的几种class之间的关系进行整理，让我们在真正用UML进行比如类图设计时能够更加清晰明了；以下就分别介绍这几种关系：</p>
<h3>继承</h3>
<p>指的是一个类（称为子类、子接口）继承另外的一个类（称为父类、父接口）的功能，并可以增加它自己的新功能的能力，继承是类与类或者接口与接口之间最常见的关系；在Java中此类关系通过关键字extends明确标识，在设计时一般没有争议性；<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Generalization.jpg" width="293" height="204" /></p>
<h3>实现</h3>
<p>指的是一个class类实现interface接口（可以是多个）的功能；实现是类与接口之间最常见的关系；在Java中此类关系通过关键字implements明确标识，在设计时一般没有争议性；<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Realization.jpg" width="121" height="203" /></p>
<h3>依赖</h3>
<p>可以简单的理解，就是一个类A使用到了另一个类B，而这种使用关系是具有偶然性的、、临时性的、非常弱的，但是B类的变化会影响到A；比如某人要过河，需要借用一条船，此时人与船之间的关系就是依赖；表现在代码层面，为类B作为参数被类A在某个method方法中使用；<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Dependence.jpg" width="430" height="97" /></p>
<h3>关联</h3>
<p>他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系，比如我和我的朋友；这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的，一般是长期性的，而且双方的关系一般是平等的、关联可以是单向、双向的；表现在代码层面，为被关联类B以类属性的形式出现在关联类A中，也可能是关联类A引用了一个类型为被关联类B的全局变量；<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Association.jpg" width="430" height="105" /></p>
<h3>聚合</h3>
<p>聚合是关联关系的一种特例，他体现的是整体与部分、拥有的关系，即has-a的关系，此时整体与部分之间是可分离的，他们可以具有各自的生命周期，部分可以属于多个整体对象，也可以为多个整体对象共享；比如计算机与CPU、公司与员工的关系等；表现在代码层面，和关联关系是一致的，只能从语义级别来区分；<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Aggregation.jpg" width="430" height="108" /></p>
<h3>组合</h3>
<p>组合也是关联关系的一种特例，他体现的是一种contains-a的关系，这种关系比聚合更强，也称为强聚合；他同样体现整体与部分间的关系，但此时整体与部分是不可分的，整体的生命周期结束也就意味着部分的生命周期结束；比如你和你的大脑；表现在代码层面，和关联关系是一致的，只能从语义级别来区分；<br />
<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Composition.jpg" width="430" height="106" /></p>
<p>对于继承、实现这两种关系没多少疑问，他们体现的是一种类与类、或者类与接口间的纵向关系；其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系，是比较难区分的，有很多事物间的关系要想准备定位是很难的，前面也提到，这几种关系都是语义级别的，所以从代码层面并不能完全区分各种关系；但总的来说，后几种关系所表现的强弱程度依次为：组合&gt;聚合&gt;关联&gt;依赖；</p>
 <img src ="http://www.blogjava.net/freeman1984/aggbug/332815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">@joe</a> 2010-09-25 14:19 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/25/332815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>