??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲福利秒拍一区二区,国产亚洲综合网曝门系列,久久精品亚洲一区二区三区浴池http://www.tkk7.com/hulizhong/category/38139.html----Java's Slave----<br> ***Java's Host***zh-cnFri, 06 Nov 2009 01:41:35 GMTFri, 06 Nov 2009 01:41:35 GMT60设计模式?/title><link>http://www.tkk7.com/hulizhong/archive/2009/11/03/300830.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Tue, 03 Nov 2009 01:40:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/11/03/300830.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/300830.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/11/03/300830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/300830.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/300830.html</trackback:ping><description><![CDATA[<img height="620" alt="" src="http://www.tkk7.com/images/blogjava_net/hulizhong/oo.jpg" width="527" border="0" /><img src ="http://www.tkk7.com/hulizhong/aggbug/300830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-11-03 09:40 <a href="http://www.tkk7.com/hulizhong/archive/2009/11/03/300830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大话之观察者模?/title><link>http://www.tkk7.com/hulizhong/archive/2009/07/07/285785.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Tue, 07 Jul 2009 04:34:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/07/07/285785.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/285785.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/07/07/285785.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/285785.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/285785.html</trackback:ping><description><![CDATA[<p>      大家都知道,毛主席对游击战有个十六字诀Q?敌进我退Q敌L扎ͼ敌疲我打Q敌退我追"?br /> 我对此的理解是当敌人的形势发生了变化,我们行动也要相应变动。其实在软g开发过E中也有cd情景。当A对象的状态变化的时候,B对象的状态也要相应变化。我们常用观察者模式解xc问题。代码如?可能和大家^常见的观察者模式的代码实现不太一P其实原理都是一L?br />     在下面的代码里,我方的情报h员显的很重要?span style="color: red">卌观察者要有到观察者的引用?/span></p> <p> public class 敌h {<br />  private ?my;</p> <p> public 敌h() {<br />   my = new ?); /* 哈哈,敌h内部的我Ҏ报h?*/<br />  }</p> <p> public void q?) {<br />   System.out.println("--敌进--");<br />   my.退();<br />  }</p> <p> public void ?) {<br />   System.out.println("--敌驻--");<br />   my.?);<br />  }</p> <p> public void ?) {<br />   System.out.println("--敌疲--");<br />   my.?);<br />  }</p> <p> public void 退() {<br />   System.out.println("--敌退--");<br />   my.q?);<br />  }<br /> }</p> <p><br />  public class ?{<br />  public void 退() {<br />   System.out.println("--我退--");<br />  }</p> <p> public void ?) {<br />   System.out.println("--我扰--");<br />  }</p> <p> public void ?) {<br />   System.out.println("--我打--");<br />  }</p> <p> public void q?) {<br />   System.out.println("--我追--");<br />  }<br /> }</p> <p> </p><img src ="http://www.tkk7.com/hulizhong/aggbug/285785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-07-07 12:34 <a href="http://www.tkk7.com/hulizhong/archive/2009/07/07/285785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入出单实例Singleton设计模式http://www.tkk7.com/hulizhong/archive/2009/07/06/285685.html二胡二胡Mon, 06 Jul 2009 06:25:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/07/06/285685.htmlhttp://www.tkk7.com/hulizhong/comments/285685.htmlhttp://www.tkk7.com/hulizhong/archive/2009/07/06/285685.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/285685.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/285685.html
深入出单实例Singleton设计模式

陈皓

前序

单实例Singleton设计模式可能是被讨论和用的最q泛的一个设计模式了Q这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目? 是想在整个系l中只能出现一个类的实例。这样做当然是有必然的,比如你的软g的全局配置信息Q或者是一个FactoryQ或是一个主控类Q等{。你希望q? 个类在整个系l中只能出现一个实例。当Ӟ作ؓ一个技术负责h的你Q你当然有权利通过使用非技术的手段来达C的目的。比如:你在团队内部明文? 定,“XXcd能有一个全局实例Q如果某Z用两ơ以上,那么该h被处于2000元的|款Q?#8221;Q呵呵)Q你当然有权q么做。但是如果你的设计的是东西是 一个类库,或是一个需要提供给用户使用的APIQ恐怕你的这规定将会失效。因为,你无权要求别Z那么做。所以,q就是ؓ什么,我们希望通过使用技术的 手段来达成这样一个目的的原因?/p>

本文会带着你深入整个Singleton的世界,当然Q我会放弃用C++语言而改用Java语言Q因Z用Javaq个语言可能更容易让我说明一些事情?/p>


Singleton的教学版?/h1>

q里Q我直接给Z个Singleton的简单实玎ͼ因ؓ我相信你已经有这斚w的一些基了。我们姑且把q具版本叫做1.0?/p>

  1. // version 1.0   
  2. public class Singleton   
  3. {   
  4.     private static final Singleton singleton = null;   
  5.   
  6.     private Singleton()   
  7.     {   
  8.     }   
  9.     public static Singleton getInstance()   
  10.     {   
  11.         if (singleton== null)   
  12.         {   
  13.             singleton= new Singleton();   
  14.         }   
  15.         return singleton;   
  16.     }   
  17. }  

在上面的实例中,我想说明下面几个Singleton的特点:Q下面这些东西可能是h皆知的,没有什么新鲜的Q?/p>

  1. U有QprivateQ的构造函敎ͼ表明q个cL不可能Ş成实例了。这主要是怕这个类会有多个实例?
  2. 即然q个cL不可能Ş成实例,那么Q我们需要一个静态的方式让其形成实例QgetInstance()。注意这个方法是在new自己Q因为其可以讉KU有的构造函敎ͼ所以他是可以保证实例被创徏出来的?
  3. 在getInstance()中,先做判断是否已Ş成实例,如果已Ş成则直接q回Q否则创建实例?
  4. 所形成的实例保存在自己cM的私有成员中?
  5. 我们取实例时Q只需要用Singleton.getInstance()p了?

当然Q如果你觉得知道了上面这些事情后学成了Q那我给你当头棒喝一下了Q事情远q没有那么简单?/p>

Singleton的实际版?/h1>

上面的这个程序存在比较严重的问题Q因为是全局性的实例Q所以,在多U程情况下,所有的全局׃n的东襉K会变得非常的危险Q这个也一P在多U程? 况下Q如果多个线E同时调用getInstance()的话Q那么,可能会有多个q程同时通过 (singleton== null)的条件检查,于是Q多个实例就创徏出来Qƈ且很可能造成内存泄露问题。嗯Q熟悉多U程的你一定会说—?#8220;我们需要线E互斥或同步”Q没错,我们 需要这个事情,于是我们的Singleton升?.1版,如下所C:

  1. // version 1.1   
  2. public class Singleton   
  3. {   
  4.     private static final Singleton singleton = null;   
  5.   
  6.     private Singleton()   
  7.     {   
  8.     }   
  9.     public static Singleton getInstance()   
  10.     {   
  11.         if (singleton== null)   
  12.         {   
  13.             synchronized (Singleton.class) {   
  14.                 singleton= new Singleton();   
  15.             }   
  16.         }   
  17.         return singleton;   
  18.     }   
  19. }  

嗯,使用了Java的synchronizedҎQ看h不错哦。应该没有问题了吧?Q错Q这q是有问题!Z么呢Q前面已l说q,如果有多个线 E同旉过(singleton== null)的条件检查(因ؓ他们q行q行Q,虽然我们的synchronizedҎ会帮助我们同步所有的U程Q让我们q行U程变成串行的一个一个去 newQ那不还是一L吗?同样会出现很多实例。嗯Q确实如此!看来Q还得把那个判断(singleton== null)条g也同步v来。于是,我们的Singleton再次升?.2版本Q如下所C:

 
  1. // version 1.2   
  2. public class Singleton   
  3. {   
  4.     private static final Singleton singleton = null;   
  5.   
  6.     private Singleton()   
  7.     {   
  8.     }   
  9.     public static Singleton getInstance()   
  10.     {   
  11.         synchronized (Singleton.class)   
  12.         {   
  13.             if (singleton== null)   
  14.             {   
  15.                 singleton= new Singleton();   
  16.             }   
  17.         }   
  18.         return singleton;   
  19.     }   
  20. }  

不错不错Q看似很不错了。在多线E下应该没有什么问题了Q不是吗Q的是q样的,1.2版的Singleton在多U程下的没有问题了Q因为我? 同步了所有的U程。只不过?#8230;…Q什么?Q还不行Q!是的Q还是有点小问题Q我们本来只是想让newq个操作q行可以了Q现在,只要是进? getInstance()的线E都得同步啊Q注意,创徏对象的动作只有一ơ,后面的动作全是读取那个成员变量,q些d的动作不需要线E同步啊。这L 作法感觉非常极端啊,Z一个初始化的创建动作,居然让我们达上了所有的L作,严重影响后箋的性能啊!

q得改!嗯,看来Q在U程同步前还得加一?singleton== null)的条件判断,如果对象已经创徏了,那么׃需要线E的同步了。OKQ下面是1.3版的Singleton?/p>

  1. // version 1.3   
  2. public class Singleton   
  3. {   
  4.     private static final Singleton singleton = null;   
  5.   
  6.     private Singleton()   
  7.     {   
  8.     }   
  9.     public static Singleton getInstance()   
  10.     {   
  11.         if (singleton== null)   
  12.         {   
  13.             synchronized (Singleton.class)   
  14.             {   
  15.                 if (singleton== null)   
  16.                 {   
  17.                     singleton= new Singleton();   
  18.                 }   
  19.             }   
  20.         }   
  21.         return singleton;   
  22.     }   
  23. }  

感觉代码开始变得有点罗嗦和复杂了,不过Q这可能是最不错的一个版本了Q这个版本又?#8220;双重?#8221;Double-Check。下面是说明Q?/p>

  1. W一个条件是_如果实例创徏了,那就不需要同步了Q直接返回就好了?
  2. 不然Q我们就开始同步线E?
  3. W二个条件是_如果被同步的U程中,有一个线E创Z对象Q那么别的线E就不用再创Z?

相当不错啊,q得非常漂亮Q请大家为我们的1.3版v立鼓掌!

Singleton的其它问?/h1>

怎么Q还有问题?Q当然还有,误住下面这条规则—?#8220;无论你的代码写得有多好,其只能在特定的范围内工作Q超个范围就要出Bug?/strong>”Q这?#8220;陈式W一定理”Q呵c你能想一惌有什么情况会让这个我们上面的代码出问题吗Q?/p>

在C++下,我不是很好D例,但是在Java的环境下Q嘿嘿,q是让我们来看看下面的一些反例和一些别的事情的讨论Q?strong>当然Q有些反例可能属于钻牛角,可能有点学院z,不过也不排除其实际可能性,q是提个醒?/strong>Q:

其一、Class Loader。不知道你对Java的Class Loader熟悉吗?“c装载器”Q!C++可没有这个东西啊。这是Java动态性的核心。顾名思义Q类装蝲器是用来把类(class)装蝲qJVM的? JVM规范定义了两U类型的c装载器Q启动内装蝲?bootstrap)和用戯定义装蝲?user-defined class loader)? 在一个JVM中可能存在多个ClassLoaderQ每个ClassLoader拥有自己的NameSpace。一个ClassLoader只能拥有一? class对象cd的实例,但是不同的ClassLoader可能拥有相同的class对象实例Q这时可能生致命的问题。如ClassLoaderAQ? 装蝲了类A的类型实例A1Q而ClassLoaderBQ也装蝲了类A的对象实例A2。逻辑上讲A1=A2Q但是由于A1和A2来自于不同的 ClassLoaderQ它们实际上是完全不同的Q如果A中定义了一个静态变量cQ则c在不同的ClassLoader中的值是不同的?/p>

于是Q如果咱们的Singleton 1.3版本如果面对着多个Class Loader会怎么P呵呵Q多个实例同样会被多个Class Loader创徏出来Q当Ӟq个有点牵强Q不q他实存在。难道我们还要整Z1.4版吗Q可是,我们怎么可能在我的SingletoncM操作 Class Loader啊?是的Q你Ҏ不可能。在q种情况下,你能做的只有是—?#8220;保证多个Class Loader不会装蝲同一个Singleton”?/p>

其二、序例化?/strong>如果我们的这个SingletoncL一个关于我们程序配|信息的cR我们需要它有序列化的功能,那么Q当反序列化的时候,我们无法控制别Z多次反序列化。不q,我们可以利用一下Serializable接口的readResolve()ҎQ比如:

  1. public class Singleton implements Serializable   
  2. {   
  3.     ......   
  4.     ......   
  5.     protected Object readResolve()   
  6.     {   
  7.         return getInstance();   
  8.     }   
  9. }  

其三、多个Java虚拟机?/strong>如果我们的程序运行在多个Java的虚拟机中。什么?多个虚拟机?q是一U什么样的情况啊。嗯Q这U情冉|有点极端Q不q还是可能出玎ͼ比如EJB或RMI之流的东ѝ要在这U环境下避免多实例,看来只能通过良好的设计或非技术来解决了?/p>

其四Qvolatile变量?/strong>关于volatileq个关键字所声明的变量可以被看作是一U? “E度较轻的同步synchronized”Q与 synchronized 块相比,volatile 变量所需的编码较,q且q行时开销也较,但是它所能实现的功能也仅是synchronized的一部分。当Ӟ如前面所qͼ我们需要的 Singleton只是在创建的时候线E同步,而后面的d则不需要同步。所以,volatile变量q不能帮助我们即能解决问题,又有好的性能。而且Q? q种变量只能在JDK 1.5+版后才能使用?/p>

其五、关于ѝ?/strong>是的Q承于Singleton后的子类也有可能造成多实例的问题。不q,因ؓ我们早把Singleton的构造函数声明成了私有的Q所以也杜l了l承q种事情?/p>

其六Q关于代码重用?/strong>也话我们的系l中有很多个c需要用到这个模式,如果我们在每一个类都中有这L代码Q那? 显得有点傻了。那么,我们是否可以使用一U方法,把这h式抽象出去?在C++下这是很Ҏ的,因ؓ有模板和友元Q还支持栈上分配内存Q所以比较容易一 些(E序如下所C)QJava下可能比较复杂一些,聪明的你知道怎么做吗Q?/p>

  1. template<CLASS T> class Singleton   
  2. {   
  3.     public:   
  4.         static T& Instance()   
  5.         {   
  6.             static T theSingleInstance; //假设T有一个protected默认构造函?  
  7.             return theSingleInstance;   
  8.         }   
  9. };   
  10.   
  11. class OnlyOne : public Singleton<ONLYONE>   
  12. {   
  13.     friend class Singleton<ONLYONE>;   
  14.     int example_data;   
  15.   
  16.     public:   
  17.         int GetExampleData() const {return example_data;}   
  18.     protected:   
  19.         OnlyOne(): example_data(42) {}   // 默认构造函?  
  20.         OnlyOne(OnlyOne&) {}   
  21. };   
  22.   
  23. int main( )   
  24. {   
  25.     cout << OnlyOne::Instance().GetExampleData()<< endl;   
  26.     return 0;   
  27. }  

 (转蝲时请注明作者和出处。未l许可,请勿用于商业用?/span>)

Q全文完Q?/p>



二胡 2009-07-06 14:25 发表评论
]]>?UML建模的要Ҏȝhttp://www.tkk7.com/hulizhong/archive/2009/04/15/265779.html二胡二胡Wed, 15 Apr 2009 08:12:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/04/15/265779.htmlhttp://www.tkk7.com/hulizhong/comments/265779.htmlhttp://www.tkk7.com/hulizhong/archive/2009/04/15/265779.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/265779.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/265779.html

UML建模的要Ҏȝ

2009-03-18 11:57作者:出处Q天极网责Q~辑Q郑?/span>

  预备知识Q?/p>

  一、UML的特性与发展现状

  UML是一ULanguage(语言)

  UML是一UModeling(建模)Language

  UML是Unified(l一)Modeling Language

  1、已q入全面应用阶段的事实标?/p>

  2、应用领域正在逐渐扩展Q包括嵌入式pȝ建模、业务徏模、流E徏模等多个领域

  3、成?#8220;产生式编E?#8221;的重要支持技术:MDA?可执行UML{?/p>

  二、徏模的目的与原?/p>

  1、帮助我们按照实际情冉|按我们需要的样式对系l进行可视化;提供一U详l说明系l的l构或行为的Ҏ;l出一个指导系l构造的模板;Ҏ们所做出的决{进行文档化?/p>

  2、仅当需要模型时Q才构徏它?/p>

  3、选择要创Z么模型对如何动手解决问题和如何Ş成解x案有着意义p的媄?每一U模型可以在不同的精度别上表示;最好的模型是与现实相联pȝ;单个模型是不充分的。对每个重要的系l最好用一l几乎独立的模型d理?/p>

  三、谁应该建模

  1、业务徏模:以领域专家ؓ主,需求分析h员是dQ系l分析员、架构师可参?/p>

  2、需求模型:以需求分析h员ؓ主,pȝ分析员是dQ领域专家提供指|架构师和资深开发h员参?/p>

  3、设计模型:高层设计模型以架构师ZQ系l分析员从需求方面提供支持,资深开发h员从技术实现方面提供支持。详l设计模型则以资深开发h员ؓ主,架构师提供指对{?/p>

  4、实现模型:以资深开发h?设计人员)ZQ架构师提供M指导?/p>

  5?a class="fllink" target="_bank">数据?/a>模型Q以数据库开发h员ؓ主,架构师提供指|资深开发h?设计人员)予以配合?/p>

  正式开?/p>

  UMLl成Q三部分(构造块、规则、公共机?Q关pd下图所C:

  

  一、构造块

  1、构造块是对模型中最h代表性的成分的抽?/p>

  建模元素QUML中的名词Q它是模型基本物理元素?/p>

  行ؓ元素QUML中的动词Q它是模型中的动态部分,是一U跨时间、空间的行ؓ?/p>

  分组元素QUML中的容器Q用来组l模型,使模型更加的l构化?/p>

  注释元素QUML中的解释部分Q和代码中的注释语句一P是用来描q模型的?/p>

  1.1、徏模元?/p>

  c?class)和对?object)

  接口(interface)

  dc?active class)

  用例(use case)

  协作(collaboration)

  构g(component)

  节点(node)

  c?class)和对?object)

  cL对一l具有相同属性、相同操作、相同关pd相同语义的对象的抽象

  UML中类是用一个矩形表C的Q它包含三个区域Q最上面是类名、中间是cȝ属性、最下面是类的方?/p>

  对象则是cȝ一个实?(object is a Instance of Class)

  接口(interface)

  接口是描q某个类或构件的一个服务操作集

  dc?active class)

  dcd际上是一U特D的cR引用它的原因,实际上是在开发中需要有一些类能够起到 启动控制zd的作?/p>

  dcL指其对象臛_拥有一个进 E或U程Q能够启动控制活动的c?/p>

  用例(use case)

  用例是著名的大师Ivar Jacobson首先提出的,现已l成Z面向对象软g开发中一个需求分析的最常用工具

  用例实例是在pȝ中执行的一pd动作Q这些动作将生成特定执行者可见的价值结果。一?用例定义一l用例实例?/p>

  协作(collaboration)

  协作定义了一个交互,它是׃l共同工作以提供某协作行为的角色和其他元素构 成的一个群体?/p>

  对于某个用例的实现就?以表CZؓ一个协?/p>

  构g(component)

  在实际的软gpȝ中,有许多要?#8220;c?#8221;更大的实体,例如一个COMlg、一个DLL文g、一个JavaBeans、一个执行文件等{。ؓ了更好地对在UML模型中对它们q行表示Q就引入了构?也译为组?

  构g是系l设计的一个模块化部分Q它隐藏了内部的实现Q对外提供了一l外部接口。在pȝ中满相同接口的lg可以自由地替?/p>

  节点(node)

  Z能够有效地对部v的结构进行徏模,UML引入了节点这一概念Q它可以用来描述实际的PC机、打印机?a class="fllink" target="_bank">服务?/a>{Y件运行的基础g

  节点是运行时存在的物理元素,它表CZ一U可计算的资源,通常臛_有存储空间和处理能力

  1.2、行为元?/p>

  交互(interaction)Q?是在特定语境中,共同完成某个d的一l对象之间交换的信息集合

  交互的表C法很简单,是一条有向直U,q在上面标有操作?/p>

  状态机(state machine)Q是一个对象或交互在生命周期内响应事g所l历的状态序?/p>

  在UML模型中将状态画Z个圆 角矩形,q在矩Ş内写出状态名 U及其子状?/p>

  1.3、分l元?/p>

  对于一个中大型的Y件系l而言Q通常会包含大量的c,因此也就会存在大量的l构事物、行Z物,Z能够更加有效地对其进行整合,生成或简或繁、或宏观或微观的模型Q就需要对其进行分l。在UML中,提供?#8220;?Package)”来完成这一目标

  1.4、注释元?/p>

  l构事物是模型的主要构造块Q行Z物则是补充了模型中的动态部分,分组事物而是用来更好地组l模型,g已经很完整了。而注释事物则是用来锦上添qQ它是用来在UML模型上添加适当的解释部?/p>

  2、关p?/p>

  UML模型的关pL较多,下图

  

  2.1 兌关系

  兌(Association)表示两个cM间存在某U语义上的联pR关联关pL供了通信的\径,它是所有关pM最通用、语义最q?/p>

  在UML中,使用一条实U来表示兌关系

  在关联关pMQ有两种比较Ҏ的关p:聚合和组?/p>

  聚合关系Q聚?Aggregation)是一U特DŞ式的兌。聚合表C类之间的关pL整体与部分的关系

  如果发现“部分”cȝ存在Q是完全依赖?#8220;整体”cȝQ那么就应该使用“l合”关系来描q?/p>

  l合是聚合的变种Q加入了一些重要的语义。也是_在一个组合关pM一个对象一ơ就只是一个组合的一部分Q?#8220;整体”负责“部分”的创建和破坏Q当“整体”被破坏时Q?#8220;部分”也随之消?/p>

  聚合像汽R和R胎,汽R坏了胎还可以用。组合就像公司和下属部门Q公司倒闭了部门也׃存在?

  2.2  泛化、实C依赖

  泛化关系描述了一般事物与该事物中的特D种cM间的关系Q也是父类与子cM间的关系?/p>

  实现关系是用来规定接口和实现接口的类或组件之间的关系。接口是操作的集合,q些操作用于规定cLlg的服务?/p>

  有两个元素X、YQ如果修改元素X的定义可能会引v对另一个元素Y的定义的修改Q则U元素Y依赖(Dependency)于元素X?/p>

  二、规?/p>

  命名Q也是Z物、关pd图v名字。和M语言一P名字都是一个标识符

  范围Q与cȝ作用域相?

  可见性:PublicQProtectedQPrivateQPackage

  三、UML公共机制

  1、规格描q?/p>

  在图形表C法的每个部分后面都有一个规格描q?也称q?Q它用来Ҏ造块的语法和语义q行文字叙述。这U构思,也就使可视化视图和文字视囄分离 Q?/p>

  2、UML修饰与通用划分

  在ؓ了更好的表示q些l节QUML中还提供了一些修饰符P例如不同可视性的W号、用斜体字表C抽象类

  UML通用划分Q?/p>

  1)cM对象的划分:cL一U抽象,对象是一个具?的实?/p>

  2)接口与实现的分离Q接口是一U声明、是一个契 U,也是服务的入?实现则是负责实施接口提供 的契U?/p>

  3、UML扩展机制

  q部分不Ҏ描述Q待?邀月注 2009.2.18)

  构造型Q在实际的徏模过E中Q可能会需要定义一些特定于某个领域或某个系l的构造块

  标记值则是用来ؓ事物d新特性的。标记值的表示Ҏ是用形如“{标记信息}”的字W串

  U束是用来增加新的语义或改变已存在规则的一U机?自由文本和OCL两种表示?。约束的表示法和标记值法cMQ都是用花括号括v来的串来表示Q不q它是不能够攑֜元素中的Q而是攑֜相关的元素附q?/p>

  4、UML视图和图

  

  囑֐            功能                备注

  cd      描述cR类的特性以及类之间的关pR       UML 1原有

  对象图     描述一个时间点上系l中各个对象的一个快?   UML 1非正式图

  复合l构图   描述cȝq行时刻的分解             UML 2.0新增

  构g图     描述构g的结构与q接              UML 1原有

  部v图     描述在各个节点上的部|Ӏ            UML 1原有

  包图      描述~译时的层次l构              UML中非正式?/p>

  用例图     描述用户与系l如何交互             UML 1原有

  zd图     描述q程行ؓ与ƈ行行为             UML 1原有

  状态机图    描述事g如何改变对象生命周期          UML 1原有

  序图     描述对象之间的交互,重点在强调顺序       UML 1原有

  通信图     描述对象之间的交互,重点在于q接        UML 1中的协作?/p>

  定时图     描述对象之间的交互,重点在于定时        UML 2.0 新增

  交互概观图   是一U顺序图与活动图的؜合           UML 2.0新增

  附:开发过E与囄对应关系

  





二胡 2009-04-15 16:12 发表评论
]]>
UML手册http://www.tkk7.com/hulizhong/archive/2009/03/10/258873.html二胡二胡Tue, 10 Mar 2009 10:08:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/10/258873.htmlhttp://www.tkk7.com/hulizhong/comments/258873.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/10/258873.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/258873.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/258873.html

目录  Q?br />


UML视图和图



一  Q静态视?

静态视?的主要组成部分是 cd关系 Q它昄为类?因ؓ它不描述旉相关的行为,因而是静态的Q?关系包括 Q关联,l承 和各U依赖,依赖包括实现和用。类间的关系l成q接cȝ路径Q不同种cȝ关系q上的l构和\?或端点上的修饰来区分?br />
例子 Q?br />
房应用的类?br />



图例 Q?br />

?Q用例图

用例作ؓ交互视图中的协作来实现的?主要从活动者的角度考虑?br />


?Q?交互视图

1 Q顺序图



2 Q协作图




?Q状态机视图

状态机昄为状态图



?Q活动视?br />
横条表示控制的分叉河q接



?Q物理视?

有两U物理视?Q实现视??配置视图

1 Q实现视?

实现视图昄为构件图

接口昄为具有哦名称的圆Q即相关的服务集 Q连接构件和接口的实U表C构件提供接口所列D的服务。从构gx口的虚线表明构g需要接口所提供的服?br />



2 Q配|视?

配置视图表达了运行时?构g实力在结点实例中的分布,l点是运行资源,如计机Q设备或内存Q该视图允许分布式的l果和资源分配被评估Q下面图中展CZpȝ中结点的U类和结Ҏ拥有构g的种c,节电昄为方块?br />


下图 ?一个实例别的配置?



?Q模型管理视?



最?来几张图






二胡 2009-03-10 18:08 发表评论
]]>
UML ??一 Q?cdhttp://www.tkk7.com/hulizhong/archive/2009/03/10/258872.html二胡二胡Tue, 10 Mar 2009 10:06:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/10/258872.htmlhttp://www.tkk7.com/hulizhong/comments/258872.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/10/258872.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/258872.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/258872.html




cd中的关系 Q?br />
1 Q一般化QGeneralization Q关p?



2 Q关? Association )关系



               2.1 :  聚合QAggregation )关系
                                 

               2.2 : 合成(Composition)关系
                                 

3 :  依赖 ( Dependency )关系
                               



二胡 2009-03-10 18:06 发表评论
]]>
cMcdpȝUML图与代码表现http://www.tkk7.com/hulizhong/archive/2009/03/10/258871.html二胡二胡Tue, 10 Mar 2009 09:55:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/10/258871.htmlhttp://www.tkk7.com/hulizhong/comments/258871.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/10/258871.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/258871.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/258871.html ?http://www.tkk7.com/liuwentao253/archive/2008/08/01/219416.html
一  Q?


?Q?





?Q?



?Q?br />


?Q?




cMcM间的关系对于理解面向对象h很重要的作用Q存在以下关p?
(1)泛化(Generalization)   Q狗与动?nbsp; (I箭?
(2)兌(Association)       Q公怸员工有特定的某种关系 (实线)
(3)依赖(Dependency)    Qh依赖Z刀 (虚线头)
(4)聚合(Aggregation)     Q?电脑和CPUQ主?(菱ŞI间?







详细展开  Q?
一 .泛化(Generalization)
 表示cMcM间的l承关系Q?strong>接口与接口之间的l承关系
Q?u>或类Ҏ口的实现关系?br />  一般泛化的关系是从子类指向父类的:
 父类 父类实例Qnew 子类()




1/**
2* 一个测试类
3*/

4public class Demo{    
5    public void test() {
6        //老虎的实?nbsp;也属于动物类?nbsp;
7        Animal animal = new Tiger();  
8    }
    
9}
 



1/**
2*  动物c?br /> 3*/

4public class Animal{
5
6}
    


1/**
2* 老虎c?nbsp;
3*/

4public class Tiger extends Animal{
5
6}
  


?.依赖(Dependency)

对于两个相对独立的对象,当一个对象(Z刀Q负责构造另一个对??的实例,或者一个对??依赖另一个对象(Z刀Q的服务Ӟq两个对象之间主要体Cؓ依赖关系?br />
下面q个例子昄属于后?Qh要做一个拧Z的动作,他就要依赖于 Z刀对象Q因为只有螺丝刀对象才提供拧Z的服务?



 1/**
 2 * 说明 Qh q个 c?nbsp;
 3 */

 4public class Person {
 5    /**
 6     * 人拥有的一?nbsp; 拧螺?nbsp; ?nbsp; 动作 依赖于螺丝刀q个c?br />  7     * @param screwdriver Q螺丝刀c?br />  8     */

 9     public void screw(Screwdriver screwdriver)
10        //Z刀cL供了拧螺丝这个服?/span>
11        screwdriver.screw();    
12    }
  
13}


?.兌(Association)
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系Ӟq两个对象之间ؓ兌关系?br /> 兌关系是用实例变量来实现
比如客户和订单,每个订单对应特定的客P每个客户对应一些特定的订单Q再例如公司和员工,每个公司对应一些特定的员工Q每个员工对应一特定的公?br />



 1/**
 2 * 公司
 3 */

 4public class Company{   
 5    //员工
 6    private Employee employee;
 7
 8    /**
 9     * 公司q作
10      */

11    public void run(){    
12        employee.startWorking();    
13    }

14    
15    public Employee getEmployee(){    
16        return employee;    
17    }
    
18    public void setEmployee(Employee employee){    
19        this.employee=employee;    
20    }
  
21}
 

?Q?聚合QAggregationQ?br /> 当对象A被加入到对象B中,成ؓ对象B的组成部分时Q对象B和对象A之间集关pR聚合是兌关系的一U,是较强的兌关系Q强调的是整体与部分之间的关pR?br /> [兌与聚合的区别]
(1)兌关系所涉及的两个对象是处在同一个层ơ上的。比如h和自行R是一U关联关p,而不是聚合关p,因ؓZ是由自行车组成的?br /> 聚合关系涉及的两个对象处于不q等的层ơ上Q一个代表整体,一个代表部分。比如电脑和它的昄器、键盘、主板以及内存就是聚集关p,因ؓL是电脑的l成部分?br /> (2)对于h聚集关系Q尤其是集关p)的两个对象,整体对象会制U它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期Q当整体消失Q部分也随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了Q除非张三事先把一些电脑的lgQ比如硬盘和内存Q拆了下来?br />


 1public class Computer{    
 2    private CPU cpu;    
 3    public CPU getCPU(){    
 4        return cpu;    
 5    }
    
 6    public void setCPU(CPU cpu){    
 7        this.cpu=cpu;    
 8    }
    
 9    //开启电?nbsp;   
10    public void start(){    
11        //cpuq作    
12        cpu.run();    
13    }
    
14}
  


二胡 2009-03-10 17:55 发表评论
]]>用例建模技?/title><link>http://www.tkk7.com/hulizhong/archive/2009/03/10/258866.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Tue, 10 Mar 2009 09:36:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/03/10/258866.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/258866.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/03/10/258866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/258866.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/258866.html</trackback:ping><description><![CDATA[?http://www.ibm.com/developerworks/cn/rational/tip-uml/index2.html<br /> <table id="content-table" cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr valign="top"> <td width="100%"> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr valign="top"> <td width="100%"> <h1>用例建模技?/h1> <p id="subtitle"><em>适合于更好的 UML 用例模型的技?/em></p> <img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" /></td> <td class="no-print" width="192"><img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/i/dw.gif" width="192" /></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr valign="top"> <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td> <td width="100%"> <table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0"> <tbody> <tr> <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td> <td> <table cellspacing="0" cellpadding="0" width="150" border="0"> <tbody> <tr> <td class="v14-header-1-small">文档选项</td> </tr> </tbody> </table> <table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td class="no-padding" width="150"><noscript></noscript><noscript></noscript> <table cellspacing="0" cellpadding="0" width="143" border="0"> <script language="JavaScript" type="text/javascript"> <!-- document.write('<tr valign="top"><td width="8"><img src="http://www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img alt="打印机的版面设|成横向打印模式" height="16" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td><td width="122"><p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p></td></tr>'); //--> </script> <tbody> <tr valign="top"> <td width="8"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></td> <td width="16"><img height="16" alt="打印机的版面设|成横向打印模式" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td> <td width="122"> <p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p> </td> </tr> <form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp"> </form> <input type="hidden" value="本文介绍了一些提高系l用例模型质量的技巧和技术。本文改~自 Object Primer 2nd Edition 的第 6 章? name="body" /><input type="hidden" value="用例建模技? name="subject" /><input type="hidden" value="cn" name="lang" /> <script language="JavaScript" type="text/javascript"> <!-- document.write('<tr valign="top"><td width="8"><img src="http://www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img src="http://www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="此作为电子邮件发? /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>此作为电子邮件发?/strong></a></p></td></tr>'); //--> </script> <tr valign="top"> <td width="8"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></td> <td width="16"><img height="16" alt="此作为电子邮件发? src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" /></td> <td width="122"> <p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>此作为电子邮件发?/strong></a></p> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br /> </td> </tr> </tbody> </table> <p>U别Q?初</p> <p><a >Scott W. Ambler</a> (<a href="mailto:scott.ambler@ronin-intl.com?subject=%E7%94%A8%E4%BE%8B%E5%BB%BA%E6%A8%A1%E6%8A%80%E5%B7%A7&amp;cc=scott.ambler@ronin-intl.com">scott.ambler@ronin-intl.com</a>), 总裁, Ronin International<br /> </p> <p>2001 q?1 ?04 ?/p> <blockquote>本文介绍了一些提高系l用例模型质量的技巧和技术。本文改~自 Object Primer 2nd Edition 的第 6 章?/blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--> <p><strong>从参与者的角度q以d语态编写用例?/strong> <br /> 应该以主动语态:“学生表明参加研习班意?#8221;Q而不是被动语?#8220;研习班意向被学生表明”来编写用例。而且Q应该从参与者的角度来编写用例。毕竟,用例的目的是理解用户如何对系l进行操作?</p> <p><strong>~写Ҏ文本Q而非功能需求?/strong> <br /> 用例描述的是对参与者来说有价值的一pd行动Q而不是特性集。例如,“招收研习班的学生”用例描述的是学生如何与系l交互来参加研习班。它没有描述用户界面看上L什么样子,或者它是如何工作的。有一些其它的模型来描q这些重要的信息Q例如用L面模型和增补规范。面向对象分析非常复杂,因此需要对它用几U模型,q且应该适当地应用每一U模型?</p> <p><strong>用例只记载行为需求?/strong> <br /> 用例既不是类规范Q也不是数据规范。这是应该由概念性模型捕捉的一U信息,在对象世界中Q它是通过 UMLcL型徏模的。您往往会引用概忉|模型中描述的类Q例如,“参加研习?#8221;用例包括?#8220;研习?#8221;?#8220;学生”{概念,它们都将由概忉|模型描q?</p> <p><strong>不要忘记用户界面?/strong> <br /> pȝ用例l常引用ȝL?(UI)元素Q这些元素常常称?#8220;边界”?#8220;用户界面”,例如 HTML面和报表。用例有时也引用一些次要的 UI元素Q例如按钮或数据输入字段Q但q种U别的细节ƈ不太常见?</p> <p><strong>创徏用例模板?/strong> <br /> 用例包含了相当数量的信息Q这些信息可以轻易地以常见格式记载。您应该考虑开发自q模板Q请参阅技?#8220; <a >记蝲用例</a>”Q?</p> <p><strong>始终如一地组l用例图?/strong> <br /> 一般的做法是垂直地l制l承 (inheritance) 和扩?(extend)兌Q在Ӟ基本用例下面l制l承Q扩展用例。同P通常水^l制包含(include) 兌。请注意Q这些是单的l验法则 --只要始终遵@q些法则Q生的囑ְ很容易理解?</p> <p><strong>不要忘记pȝ对参与者行动的响应?/strong> <br /> 用例既应该描q参与者是如何与系l交互的Q也应该描述pȝ如何响应q些交互。例如,?#8220;参加研习?#8221;用例中,如果pȝ在学生表明他们希望参加研习班时没有做出响应,学生׃很沮丧地d?</p> <p><strong>备选行动过E非帔R要?/strong> <br /> 如果一切顺利,使用的将是基本行动过E?--但也不要忘记备选过E。引入备选过E是Z描述潜在的用错误以及商业逻辑错误和异常。这些重要的信息对于驱动pȝ的设计来说很有必要,因此不要忘记在用例中对它们徏模?</p> <p><strong>不要?<<include>> ?<<extend>>兌所困扰?/strong> <br /> 我不是很定到底发生了什么事Q但我L在想包含 (include) 和扩?extend) 兌Q以及旧版本 UML 中?(uses) 和扩?(extends)兌的正用从来没有得到很好的描述。结果,用例建模组往往在这些关联的正确应用上争Z休,在整个徏模技术中一些有但ơ要的部分上费了惊人的旉。我曑֜一个组l中工作Q这家组l居然取~了<<include>> ?<<extend>>原型的用,几个星期后,当意识到公司仍然需要这些概忉|不得不撤消了q种极端的解x案,而这时该l织对它们的正确使用q没有达成共识?</p> <p><strong>让用例带动用h档?/strong> <br /> 用户文档的目的是描述如何使用pȝ。每个用例都描述了参与者通过使用pȝ所采取的一pd动作。简而言之,用例包含从中开始编写问党用L当的信息。例如,可以使用“参加研习?#8221;用例作ؓ基础来编写系l用h档的“如何参加研习?#8221;一节?</p> <p><strong>让用例带动演C?/strong> <br /> 软g开发过E中的一部分是向目资金理者通报工作成果Q因此有旉要提供演C。因为用例是从用L角度~写的,它们包含了演CZ对资金管理者可能希望听到的事物的有价值的深刻见解。换句话_用例通常包含制定演示E所需的逻辑?</p> <br /> <br /> <p><a name="resources"><span id="xrvxz9r" class="atitle">参考资?</span></a></p> <ul> <li>您可以参阅本文在 developerWorks 全球站点上的 <a >英文原文</a>. <br /> <br /> </li> <li><a ><em>The Object Primer 2nd Edition</em> </a>Q由 Scott W. Ambler 著。New York: Cambridge University Press, 2001?<br /> <br /> </li> <li><a ><em>The Unified Process Inception Phase</em> </a>Q由 Scott W. Ambler ?Larry L. Constantine 合著。Gilroy, CA: R&D Books, 2000?<br /> <br /> </li> <li><a ><em>Software For Use: A Practical Guide to the Models and Methods of Usage-Centered Design</em> </a>Q由 Larry L. Constantine and Lucy A.D. Lockwood 合著?<br /> <br /> </li> <li><a ><em>The Unified Modeling Language Reference Manual</em> </a>Q由 James Rumbaugh、Grady Booch ?Ivar Jacobson 合著。Reading, MA: Addison-Wesley Longman, Inc., 1999?<br /> </li> </ul> <br /> <br /> <p><a name="author"><span id="r79hn99" class="atitle">关于作?/span></a></p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td> </tr> <tr valign="top" align="left"> <td> <p><img height="71" alt="Author photo" src="http://www.ibm.com/developerworks/cn/i/scottambler.jpg" width="64" align="left" /></p> </td> <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td> <td width="100%"> <p>Scott W. Ambler ?<a >Ronin International</a> 的总裁Q该公司是一家专门提供面向对象Y件过E指对{体pȝ构徏模和 Enterprise JavaBean (EJB) 开发的咨询企业。他创作或者与其他人合著了几本有关面向对象开发的书籍Q包括最q出版的 <em>Object Primer 2nd Edition</em>Q该书详l介l了本文所概述的主题。可以通过 <a href="mailto:scott.ambler@ronin-intl.com?cc=scott.ambler@ronin-intl.com">scott.ambler@ronin-intl.com</a> 与他联系Q他的网站位?<a >www.ambysoft.com</a>?</p> </td> </tr> </tbody> </table> <br /> </td> </tr> </tbody> </table><img src ="http://www.tkk7.com/hulizhong/aggbug/258866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-03-10 17:36 <a href="http://www.tkk7.com/hulizhong/archive/2009/03/10/258866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用例建模指南http://www.tkk7.com/hulizhong/archive/2009/03/10/258766.html二胡二胡Tue, 10 Mar 2009 04:04:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/10/258766.htmlhttp://www.tkk7.com/hulizhong/comments/258766.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/10/258766.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/258766.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/258766.html

用例建模指南

developerWorks
文档选项
打印机的版面设|成横向打印模式

打印本页

此作为电子邮件发? src=

此作为电子邮件发?/strong>


U别Q?初

傅纯一, Rational中国区技术销售经? IBM中国有限公司软g?br />

2004 q?11 ?01 ?/p>

用例(Use Case)是一U描q系l需求的ҎQ用用例的Ҏ来描q系l需求的q程是用例建模。用例方法最早是由Iva Jackboson博士提出的,后来被综合到UML规范之中Q成ZU标准化的需求表qCpR用例的使用在RUP中被推崇备至Q整个RUP程都被UC?用例驱动"(Use-Case Driven)的,各种cd的开发活动包括项目管理、分析设计、测试、实现等都是以系l用例ؓ主要输入工gQ用例模型奠定了整个pȝ软g开发的基础?/blockquote>

1. 什么是用例Q?/span>

在介始用例方法之前,我们首先来看一下传l的需求表q方?"软g需求规U?(Software Requirement Specification)。传l的软g需求规U基本上采用的是功能分解的方式来描述pȝ功能Q在q种表述方式中,pȝ功能被分解到各个pȝ功能模块中,我们通过描述l分的系l模块的功能来达到描q整个系l功能的目的。一个典型的软g需求规U可能具有以下Ş式:



采用q种Ҏ来描q系l需求,非常Ҏh需求和设计的界限,q样的表q实际上已经包含了部分的设计在内。由此常常导致这LqhQ系l需求应该详l到何种E度Q一个极端就是需求可以详l到概要设计Q因L需求表q既包含了外部需求也包含了内部设计。在有些公司的开发流E中Q这U需求被UCؓ"内部需?Q而对应于用户的原始要求则被称之ؓ"外部需??/p>

功能分解Ҏ的另一个缺Ҏq种Ҏ分割了各系l功能的应用环境Q从各项功能入手,你很难了解到q些功能Ҏ如何怺兌来实C个完成的pȝ服务的。所以在传统的SRS文档中,我们往往需要另外一些章节来描述pȝ的整体结构及各部分之间的怺兌Q这些内容得SRS需求更象是一个设计文档?/p>

1.1 参与者和用例

从用L角度来看Q他们ƈ不想了解pȝ的内部结构和设计Q他们所兛_的是pȝ所能提供的服务Q也是被开发出来的pȝ是如何被用的Q这q例方法的基本思想。用例模型主要由以下模型元素构成Q?/p>

  • 参与?Actor)
    参与者是指存在于被定义系l外部ƈ与该pȝ发生交互的h或其他系l,他们代表的是pȝ的用者或使用环境?
  • 用例(Use Case)
    用例用于表示pȝ所提供的服务,它定义了pȝ是如何被参与者所使用的,它描q的是参与者ؓ了用系l所提供的某一完整功能而与pȝ之间发生的一D对话?
  • 通讯兌(Communication Association)
    通讯兌用于表示参与者和用例之间的对应关p,它表C参与者用了pȝ中的哪些服务Q用例)Q或者说pȝ所提供的服务(用例Q是被哪些参与者所使用的?

q大三种模型元素在UML中的表述如下图所C?/p>

以银行自动提ƾ机(ATM)ZQ它的主要功能可以由下面的用例图来表C。ATM的主要用者是银行客户Q客户主要用自动提ƾ机来进行银行帐L查询、提Ƒ֒转帐交易?/p>

通讯兌表示的是参与者和用例之间的关p,头表示在这一关系中哪一Ҏ对话的主动发赯,头所指方是对话的被动接受者;如果你不惛_调对话中的主动与被动关系Q可以用不带箭头的兌实线。在参与者和用例之间的信息流不是由通讯兌来表C的Q该信息是~省存在的(用例本n描述的就是参与者和pȝ之间的对话)Qƈ且信息流向是双向的,它与通讯兌头所指的方向x关系?/p>

1.2 用例的内?/span>

用例图我们对系l的功能有了一个整体的认知Q我们可以知道有哪些参与者会与系l发生交互,每一个参与者需要系lؓ它提供什么样的服务。用例描q的是参与者与pȝ之间的对话,但是q个对话的细节ƈ没有在用例图中表q出来,针对每一个用例我们可以用事g来描述q一对话的细节内宏V如在ATMpȝ中的"提款" 用例可以用事件流表述如下Q?/p>

提款-基本事g?/p>

1. 用户插入信用?/p>

2. 输入密码

3. 输入提款金额

4. 提取现金

5. 退出系l,取回信用?/p>

但是q只描述了提Ƅ例中最利的一U情况,作ؓ一个实用的pȝQ我们还必须考虑可能发生的各U其他情况,如信用卡无效、输入密码错、用户帐号中的现金余额不够等Q所有这些可能发生的各种情况Q包括正常的和异常的Q被UC为用例的场景(Scenario)Q场景也被称作是用例的实?Instance)。在用例的各U场景中Q最常见的场景是用基本流(Basic Flow)来描q的Q其他的场景则是用备选流(Alternative Flow)来描q。对于ATMpȝ中的"提款"用例Q我们可以得到如下一些备选流Q?/p>

提款-备选事件流

备选流一Q用户可以在基本中的Q何一步选择退出,转至基本步??/p>

备选流二:在基本流步骤1中,用户插入无效信用卡,pȝ昄错误qZ用卡Q用例结束?/p>

备选流三:在基本流步骤Q中Q用戯入错误密码,pȝ昄错误q提C用户重新输入密码,重新回到基本步?Q三ơ输入密码错误后Q信用卡被系l没Ӟ用例l束?/p>

通过基本与备选流的组合,可以将用例所有可能发生的各种场景全部描述清楚。我们在描述用例的事件流的时候,是要尽可能地将所有可能的场景都描q出来,以保证需求的完备性?/p>

1.3 用例Ҏ的优?/span>

用例Ҏ完全是站在用L角度上(从系l的外部Q来描述pȝ的功能的。在用例Ҏ中,我们把被定义pȝ看作是一个黑,我们q不兛_pȝ内部是如何完成它所提供的功能的。用例方法首先描qC被定义系l有哪些外部使用者(抽象成ؓActorQ,q些使用者与被定义系l发生交互;针对每一参与者,用例Ҏ又描qCpȝ些参与者提供了什么样的服务(抽象成ؓUse CaseQ,或者说pȝ是如何被q些参与者用的。所以从用例图中Q我们可以得到对于被定义pȝ的一个M印象?/p>

与传l的功能分解方式相比Q用例方法完全是从外部来定义pȝ的功能,它把需求与设计完全分离开来。在面向对象的分析设计方法中Q用例模型主要用于表q系l的功能性需求,pȝ的设计主要由对象模型来记录表q。另外,用例定义了系l功能的使用环境与上下文Q每一个用例描q的是一个完整的pȝ服务。用例方法比传统?SRS更易于被用户所理解Q它可以作ؓ开发h员和用户之间针对pȝ需求进行沟通的一个有效手Dc?/p>

在RUP中,用例被作为整个Y件开发流E的基础Q很多类型的开发活动都把用例作Z个主要的输入工g(Artifact)Q如目理、分析设计、测试等。根据用例来对目标系l进行测试,可以Ҏ用例中所描述的环境和上下文来完整地测试一个系l服务,可以Ҏ用例的各个场?Scenario)来设计测试用例,完全地测试用例的各种场景可以保证试的完备性?/p>



回页?/strong>


2. 建立用例模型

使用用例的方法来描述pȝ的功能需求的q程是用例建模Q用例模型主要包括以下两部分内容Q?/p>

  • 用例?Use Case Diagram)
    定pȝ中所包含的参与者、用例和两者之间的对应关系Q用例图描述的是关于pȝ功能的一个概q?
  • 用例规约(Use Case Specification)
    针对每一个用例都应该有一个用例规U文档与之相对应Q该文档描述用例的细节内宏V?

在用例徏模的q程中,我们的步聚是先找出参与者,再根据参与者确定每个参与者相关的用例Q最后再l化每一个用例的用例规约?/p>

2.1 L参与?/span>

所谓的参与者是指所有存在于pȝ外部q与pȝq行交互的h或其他系l。通俗地讲Q参与者就是我们所要定义系l的使用者。寻扑֏与者可以从以下问题入手Q?/p>

  • pȝ开发完成之后,有哪些h会用这个系l?
  • pȝ需要从哪些人或其他pȝ中获得数据?
  • pȝ会ؓ哪些人或其他pȝ提供数据Q?/li>
  • pȝ会与哪些其他pȝ相关联?
  • pȝ是由谁来l护和管理的Q?/li>

q些问题有助于我们抽象出pȝ的参与者。对于ATM机的例子Q回{这些问题可以我们扑ֈ更多的参与者:操作员负责维护和理ATM机系l、ATMZ需要与后台服务器进行通讯以获得有关用户帐L相关信息?/p>

2.1.1 pȝ边界军_了参与?/strong>

参与者是ql的边界所军_的,如果我们所要定义的pȝ边界仅限于ATM机本w,那么后台服务器就是一个外部的pȝQ可以抽象ؓ一个参与者?/p>

如果我们所要定义的pȝ边界扩大x个银行系l,ATM机和后台服务器都是整个银行系l的一部分Q这时候后台服务器׃再被抽象成ؓ一个参与者?/p>

值得注意的是Q用例徏模时不要一些系l的l成l构作ؓ参与者来q行抽象Q如在ATM机系l中Q打印机只是pȝ的一个组成部分,不应它抽象成一个独立的参与者;在一个MIS理pȝ中,数据库系l往往只作为系l的一个组成部分,一般不其单独抽象成一个参与者?/p>

2.1.2 Ҏ的参与者――系l时?/strong>

有时候我们需要在pȝ内部定时地执行一些操作,如检系l资源用情c定期地生成l计报表{等。从表面上看Q这些操作ƈ不是由外部的人或pȝ触发的,应该怎样用用例方法来表述q一cd能需求呢Q对于这U情况,我们可以抽象Z个系l时钟或定时器参与者,利用该参与者来触发q一cd时操作。从逻辑上,q一参与者应该被理解成是pȝ外部的,由它来触发系l所提供的用例对话?/p>

2.2 定用例

扑ֈ参与者之后,我们可以根据参与者来定pȝ的用例,主要是看各参与者需要系l提供什么样的服务,或者说参与者是如何使用pȝ的。寻扄例可以从以下问题入手Q针Ҏ一个参与者)Q?/p>

  • 参与者ؓ什么要使用该系l?
  • 参与者是否会在系l中创徏、修攏V删除、访问、存储数据?如果是的话,参与者又是如何来完成q些操作的?
  • 参与者是否会外部的某些事g通知l该pȝQ?/li>
  • pȝ是否会将内部的某些事仉知该参与者?

l合以上所qͼATMpȝ的用例图可表C如下,



在用例的抽取q程中,必须注意Q用例必L由某一个主角触发而生的zdQ即每个用例臛_应该涉及一个主角。如果存在与主角不进行交互的用例Q就可以考虑其q入其他用例Q或者是查该用例相对应的参与者是否被遗漏Q如果是Q则补上该参与者。反之,每个参与者也必须臛_涉及C个用例,如果发现有不与Q何用例相兌的参与者存在,应该考虑该参与者是如何与系l发生对话的Q或者由参与者确定一个新的用例,或者该参与者是一个多余的模型元素Q应该将其删除?/p>

可视化徏模的主要目的之一是要增强团队的沟通,用例模型必须是易于理解的。用例徏模往往是一个团队开发的q程Q系l分析员在徏模过E中必须注意参与者和用例的名U应该符合一定的命名U定Q这h个用例模型才能够W合一定的风格。如参与者的名称一般都是名词,用例名称一般都是动宾词l等?/p>

对于同一个系l,不同的h对于参与者和用例都可能有不同的抽象结果,因而得C同的用例模型。我们需要在多个用例模型Ҏ中选择一U?最?Q或"较佳"Q的l果Q一个好的用例模型应该能够容易被不同的涉众所理解Qƈ且不同的涉众对于同一用例模型的理解应该是一致的?/p>

2.3 描述用例规约

应该避免q样一U误解――认为由参与者和用例构成的用例图是用例模型Q用例图只是在M上大致描qCpȝ所能提供的各种服务Q让我们对于pȝ的功能有一个M的认识。除此之外,我们q需要描q每一个有例的详细信息Q这些信息包含在用例规约中,用例模型是由用例囑֒每一个用例的详细描述――用例规U所l成的。RUP中提供了用例规约的模板,每一个用例的用例规约都应该包含以下内容:

  • 要说?(Brief Description)
    要介l该用例的作用和目的?
  • 事g?(Flow of Event)
    包括基本和备选流Q事件流应该表示出所有的场景?
  • 用例场景 (Use-Case Scenario)
    包括成功场景和失败场景,场景主要是由基本和备选流l合而成的?
  • Ҏ需?(Special Requirement)
    描述与该用例相关的非功能性需求(包括性能、可靠性、可用性和可扩展性等Q和设计U束Q所使用的操作系l、开发工LQ?
  • 前置条g (Pre-Condition)
    执行用例之前pȝ必须所处的状态?
  • 后置条g (Post-Condition)
    用例执行完毕后系l可能处于的一l状态?

用例规约基本上是用文本方式来表述的,Z更加清晰地描qC件流Q也可以选择使用状态图、活动图或序列图来辅助说明。只要有助于表达的简z明了,可以在用例中Q意粘贴用L面和程的图形化昄方式Q或是其他图形。如zd图有助于描述复杂的决{流E,状态{Ud有助于描qC状态相关的pȝ行ؓQ序列图适合于描q基于时间顺序的消息传递?/p>

2.3.1 基本?/strong>

基本描q的是该用例最正常的一U场景,在基本流中系l执行一pdzd步骤来响应参与者提出的服务h。我们徏议用以下格式来描q基本流Q?/p>

1) 每一个步骤都需要用数字~号以清楚地标明步骤的先后顺序?/p>

2) 用一句简短的标题来概括每一步骤的主要内容,q样阅读者可以通过览标题来快速地了解用例的主要步骤。在用例建模的早期,我们也只需要描q到事g步骤标题这一层,以免q早地陷入到用例描述的细节中厅R?/p>

3) 当整个用例模型基本稳定之后,我们再针Ҏ一步骤详细描述参与者和pȝ之间所发生的交互。徏议采用双?roundtrip)描述法来保证描述的完整性,x一步骤都需要从正反两个斚w来描q?(1)参与者向pȝ提交了什么信息;(2)Ҏpȝ有什么样的响应。具体例子请参见附录?/p>

在描q参与者和pȝ之间的信息交换时Q需指出来回传递的具体信息。例如,只表q参与者输入了客户信息׃够明,最好明地说参与者输入了客户姓名和地址。通常可以利用词汇表让用例的复杂性保持在可控范围内,可以在词汇表中定义客户信息等内容Q用例不至于陷入过多的l节?/p>

2.3.2 备选流

备选流负责描述用例执行q程中异常的或偶发生的一些情况,备选流和基本流的组合应该能够覆盖该用例所有可能发生的场景。在描述备选流Ӟ应该包括以下几个要素Q?/p>

1) LQ该备选流从事件流的哪一步开始;

2) 条gQ在什么条件下会触发该备选流Q?/p>

3) 动作Q系l在该备选流下会采取哪些动作Q?/p>

4) 恢复Q该备选流l束之后Q该用例应如何l执行?/p>

备选流的描q格式可以与基本的格式一_也需要编号ƈ以标题概q其内容Q编号前可以加以字母前缀A(Alternative)以示与基本流步骤相区别?/p>

2.3.3 用例场景

用例在实际执行的时候会有很多的不同情况发生Q称之ؓ用例场景Q也可以说场景是用例的实例,我们在描q用例的时候要覆盖所有的用例场景Q否则就有可能导致需求的遗漏。在用例规约中,场景的描q可以由基本和备选流的组合来表示。场景既可以帮助我们防止需求的遗漏Q同时也可以对后l的开发工作v到很大的帮助Q开发h员必d现所有的场景、测试h员可以根据用例场景来设计试用例?/p>

2.3.4 Ҏ需?/strong>

Ҏ需求通常是非功能性需求,它ؓ一个用例所专有Q但不适合在用例的事g文本中q行说明。特D需求的例子包括法律或法规方面的需求、应用程序标准和所构徏pȝ的质量属性(包括可用性、可靠性、性能或支持性需求等Q。此外,其他一些设计约束,如操作系l及环境、兼Ҏ需求等Q也可以在此节中记录?/p>

需要注意的是,q里记录的是专属于该用例的特D需求;对于一些全局的非功能性需求和设计U束Q它们ƈ不是该用例所专有的,应把它们记录在《补充规U》中?/p>

2.3.5 前置和后|条?/strong>

前置条g是执行用例之前必d在的pȝ状态,后置条g是用例一执行完毕后系l可能处于的一l状态?/p>

2.4 查用例模?/span>

用例模型完成之后Q可以对用例模型q行查,看看是否有遗漏或错误之处。主要可以从以下几个斚w来进行检查:

  • 功能需求的完备?
    现有的用例模型是否完整地描述了系l功能,q也是我们判断用例徏模工作是否结束的标志。如果发现还有系l功能没有被记录在现有的用例模型中,那么我们需要抽象一些新的用例来记录q些需求,或是他们归U_一些现有的用例之中?
  • 模型是否易于理解
    用例模型最大的优点在于它应该易于被不同的涉众所理解Q因而用例徏模最主要的指导原则就是它的可理解性。用例的_度、个C及模型元素之间的关系复杂E度都应该由该指导原则决定?
  • 是否存在不一致?
    pȝ的用例模型是由多个系l分析员协同完成的,模型本n也是由多个工件所l成的,所以我们要特别注意不同工g之前是否存在前后矛盾或冲H的地方Q避免在模型内部产生不一致性。不一致性会直接影响到需求定义的准确性?
  • 避免二义性语?
    好的需求定义应该是无二义性的Q即不同的h对于同一需求的理解应该是一致的。在用例规约的描qCQ应该避免定义含义模p的需求,x二义性?




回页?/strong>


3. pȝ需?/span>

RUP中根据FURPS+模型系l需求分Z下几c:

  • 功能(Functionality)
  • 可用?Usability)
  • 可靠?Reliability)
  • 性能(Performance)
  • 可支持?Supportability)
  • 设计U束{?/li>

除了W一功能性需求之外的其他需求都归之为非功能性需求?/p>

3.1 需求工仉

用例模型主要用于描述pȝ的功能性需求,对于其他的非功能性需要用其他文档来记录。RUP中定义了如下的需求工仉合?/p>

  • 用例模型Q记录功能性需?
    • 用例图:描述参与者和用例之间的关p?/li>
    • 用例规约Q描q每一个用例的l节信息
  • 补充规约Q记录一些全局性的功能需求、非功能性需求和设计U束{?/li>
  • 词汇表:记录一些系l需求相关的术语

在实际应用中Q除了这些工件之外,我们q可以根据实际需求灵z选用其他形式的文档来补充说明需求。ƈ不是所有的pȝ需求都适保合用用例模型来描q的Q如~译器,我们很难用用例方法来表述它所处理的语a的方法规则,在这U情况下Q采用传l的BNF范式来表q更加合适一些。在电信软g行业中,很多电信标准都是采用SDL语言来描q的Q我们也不必用UML来改写这些标准(UML对SDL存在着q样的兼Ҏ)Q只需SDL形式的电信标准作为需求工件之一Q在其他工g中对其加以引用就可以了。MQ万万不可拘泥于用例建模的Ş式,应灵z运用各U方式的长处?/p>

3.2 补充规约

补充规约记录那些在用例模型中不易表述的系l需求,主要包括以下内容?/p>

  • 功能?
    功能性需求主要在用例模型中刻画,但是也有部分需求不适合在用例中表述。有些功能性需求是全局性的Q适用于所有的用例Q如出错处理、I18N支持{,我们不需要在所有的用例中描q这些功能性需求,只需要在补充规约中统一描述可以了?
  • 可用?
    记录所有可用性相关的需求,如系l的使用者所需要的培训旉、是否应附合一些常见的可用性标准如Windows界面风格{?
  • 可靠?
    定义pȝ可靠性相关的各种指标Q包括:
    • 可用性:指出可用旉癑ֈ?xx.xx%)Q系l处于用、维护、降U模式等操作的小时数Q?/li>
    • q_故障间隔旉(MTBF)Q通常表示为小时数Q但也可表示为天数、月数或q数Q?/li>
    • q_修复旉(MTTR)Q系l在发生故障后可以暂停运行的旉Q?/li>
    • _度:指出pȝ输出要求具备的精密度Q分辨率Q和_度(按照某一已知的标准)Q?/li>
    • 最高错误或~陷率:通常表示为bugs/KLOCQ每千行代码的错误数目)或bugs/function-pointQ每个功能点的错误数目)?/li>
  • 性能
    记录pȝ性能相关的各U指标,包括Q?
    • 对事务的响应旉Q^均、最长)Q?/li>
    • 吞吐量(例如每秒处理的事务数Q;
    • 定wQ例如系l可以容U的客户或事务数Q;
    • 降模式Q当pȝ以某UŞ式降U时可接受的q行模式Q;
    • 资源利用情况Q内存、磁盘、通信{?/li>
  • 可支持?
    定义所有与pȝ的可支持性或可维护性相关的需求,其中包括~码标准、命名约定、类库、如何来对系l进行维护操作和相应的维护实用工L?
  • 设计U束
    设计U束代表已经批准q必遵循的设计军_Q其中包括Y件开发流E、开发工兗系l构架、编E语a、第三方构gcd、运行^台和数据库系l等{?

3.3 词汇?/span>

词汇表主要用于定义项目特定的术语Q它有助于开发h员对目中所用的术语有统一的理解和使用Q它也是后箋阶段中进行对象抽象的基础?/p>



回页?/strong>


4. 调整用例模型

在一般的用例图中Q我们只表述参与者和用例之间的关p,卛_们之间的通讯兌。除此之外,我们q可以描q参与者与参与者之间的泛化 (generalization)、用例和用例之间的包?include)、扩?extend)和泛?generalization)关系。我们利用这些关pL调整已有的用例模型,把一些公q信息抽取出来重用Q得用例模型更易于l护。但是在应用中要心选用q些关系Q一般来说这些关p都会增加用例和关系的个敎ͼ从而增加用例模型的复杂度。而且一般都是在用例模型完成之后才对用例模型q行调整Q所以在用例建模的初期不必要急于抽象用例之间的关pR?/p>

4.1 参与者之间的关系

参与者之间可以有泛化(Generalization)关系Q或UCؓ"l承"关系Q。例如在需求分析中常见的权限控刉题(如下图所C)Q一般的用户只可以用一些常规的操作Q而管理员除了常规操作之外q需要进行一些系l管理工作,操作员既可以q行常规操作又可以进行一些配|操作?/p>

在这个例子中我们会发现管理员和操作员都是一U特D的用户Q他们拥有普通用h拥有的全部权限,此外他们q有自己独有的权限。这里我们可q一步把普通用户和理员、操作员之间的关pL象成泛化(Generalization)关系Q管理员和操作员可以l承普通用L全部Ҏ(包括权限Q,他们又可以有自己独有的特性(如操作、权限等Q。这样可以显著减速少用例图中通讯兌的个敎ͼ化用例模型,使之更易于理解?/p>

4.2 用例之间的关p?/span>

用例描述的是pȝ外部可见的行为,是系lؓ某一个或几个参与者提供的一D完整的服务。从原则上来Ԍ用例之间都是q列的,它们之间q不存在着包含从属关系。但是从保证用例模型的可l护性和一致性角度来看,我们可以在用例之间抽象出包含(include)、扩?extend)和泛?(generalization)q几U关pR这几种关系都是从现有的用例中抽取出公共的那部分信息Q然后通后q不同的Ҏ来重用这部公׃息,以减模型维护的工作量?/p>

4.2.1 包含(include)

包含关系是通过在关联关pM应用<<include>>构造型来表C的Q如下图所C。它所表示的语义是指基用例(Base)会用到被包含用例(Inclusion)Q具体地Ԍ是被包含用例的事件流插入到基用例的事件流中?/p>

包含关系是UML1.3中的表述Q在UML1.1中,同等语义的关p被表述Z?uses)Q如下图?/p>

?ATMZQ如果查询、取现、{帐这三个用例都需要打C个回执给客户Q我们就可以把打印回执这一部分内容提取出来Q抽象成Z个单独的用例"打印回执"Q而原有的查询、取现、{帐三个例都会包含q个用例。每当以后要Ҏ印回执部分的需求进行修ҎQ就只需要改动一个用例,而不用在每一个用例都作相应修改,q样提高了用例模型的可l护性?/p>

在基用例的事件流中,我们只需要引用被包含用例卛_?/p>

查询-基本事g?/p>

1. 用户插入信用?/p>

2. 输入密码

3. 选择查询

4. 查看帐号余额

5. 包含用例"打印回执"

6. 退出系l,取回信用?/p>

在这个例子中Q多个用例需要用到同一D行为,我们可以把这D共同的行ؓ单独抽象成ؓ一个用例,然后让其他的用例来包含这一用例。从而避免在多个用例中重复性地描述同一D行为,也可以防止该D行为在多个用例中的描述出现不一致性。当需要修改这D公q需求时Q我们也只需要修改一个用例,避免同时修改多个用例而生的不一致性和重复性工作?/p>

有时当某一个用例的事g过于复杂时Qؓ了简化用例的描述Q我们也可以把某一D事件流抽象成ؓ一个被包含的用例。这U情늱g在过E设计语a中,程序的某一D늮法封装成一个子q程Q然后再从主E序中调用这一子过E?/p>

4.2.2 扩展(extend)

扩展QextendQ关pd下图所C,基础用例(Base)中定义有一臛_个已命名的扩展点Q扩展关pL指将扩展用例(Extension)的事件流在一定的条g下按照相应的扩展Ҏ入到基础用例(Base)中。对于包含关p而言Q子用例中的事g是一定插入到基础用例中去的,q且插入点只有一个。而扩展关pd以根据一定的条g来决定是否将扩展用例的事件流插入基础用例事g,q且插入点可以有多个?/p>

例如对于电话业务Q可以在基本通话(Call)业务上扩展出一些增g务如Q呼叫等?Call Waiting)和呼叫{U?Call Transfer)。我们可以用扩展关系这些业务的用例模型描述如下?/p>



在这个例子中Q呼叫等待和呼叫转移都是对基本通话用例的扩展,但是q两个用例只有在一定的条g下(如应{方正忙或应{方无应{)才会被扩展用例的事件流嵌入基本通话用例的扩展点Qƈ重用基本通话用例中的事g?/p>

值得注意的是扩展用例的事件流往往可以也可抽象为基用例的备选流Q如上例中的呼叫{待和呼叫{U都可以作ؓ基本通话用例的备选流而存在。但是基本通话用例已经是一个很复杂的用例了Q选用扩展关系增g务抽象成为单独的用例可以避免基础用例q于复杂Qƈ且把一些可选的操作独立装在另外的用例中?/p>

4.2.3 泛化(generalization)

当多个用例共同拥有一U类似的l构和行为的时候,我们可以它们的共性抽象成为父用例Q其他的用例作ؓ泛化关系中的子用例。在用例的泛化关pMQ子用例是父用例的一U特DŞ式,子用例承了父用例所有的l构、行为和关系。在实际应用中很用泛化关p,子用例中的特D行为都可以作ؓ父用例中的备选流存在?/p>

以下是一个用例泛化关pȝ例子Q执行交易是一U交易抽象,执行房交易和执行证怺易都是一U特D的交易形式?/p>

用例泛化关系中的事g示例如下:



4.3 调整用例模型

用例模型建成之后Q我们可以对用例模型q行视,看是否可以进一步简化用例模型、提高重用程度、增加模型的可维护性。主要可以从以下查点(checkpoints)入手:

  • 用例之间是否怺独立Q如果两个用例L以同L序被激z,可能需要将它们合ƈZ个用例?/li>
  • 多个用例之间是否有非常相似的行ؓ或事件流Q如果有Q可以考虑它们合qؓ一个用例?/li>
  • 用例事g的一部分是否已被构徏为另一个用例?如果是,可以让该用例包含(include)另一用例?/li>
  • 是否应该一个用例的事g插入另一个用例的事g中Q如果是Q利用与另一个用例的扩展关系(extend)来徏立此模型?




回页?/strong>


5. 理用例模型复杂?/span>

一般小型的pȝQ其用例模型中包含的参与者和用例不会太多Q一个用例图可以容Ux有的参与者,所有的参与者和用例也可以ƈ存于同一个层ơ结构中。对于较复杂的大中型pȝQ用例模型中的参与者和用例会大大增加,我们需要一些方法来有效地管理由于规模上升而造成的复杂度?/p>

5.1 用例?/span>

?(Package)是UML中最常用的管理模型复杂度的机Ӟ包也是UML中语义最单的一U模型元素,它就是一U容器,在包中可以容U_他Q意的模型元素Q包括其他的包)。在用例模型中,我们可以用构造型(Sterotype)<<use case>>来扩展标准UML包的语义Q这U新的包叫作用例?Use Case Package)Q用于分cȝ理用例模型中的模型元素?/p>

我们可以Ҏ参与者和用例的特性来对它们进行分c,分别|于不同的用例包理之下。例如对于一个大型的企业理信息pȝQ我们可以根据参与者和用例的内容将它们分别归于人力资源、胦务、采购、销售、客务服务这些用例包之下。这h们将整个用例模型划分成ؓ两个层次Q在W一层次我们看到的是pȝ功能d分ؓ五部分,在第二层ơ我们可以分别看到每一用例包内部的参与者和用例?/p>

一个用例模型需要有多少个用例包取决你想怎么h理用例模型的复杂度Q包括参与者和用例的个敎ͼ以及它们之间的相互关p)。UML中的包其实就cM于文件系l中的目录,文g数量的时候不需要额外的目录Q文件数量一多就需要有多个目录来分cȝ理,同样一l文件不同的Z创徏不同的目录结构来q行理Q关键是要保证在目录l构下每一个文仉要易于访问。同L道理存在于用例徏模之中,如何创徏用例包以及用例包的个数取决于不同的系l和pȝ分析员,但要保证整个用例模型易于理解?/p>

5.2 用例的粒?/span>

我的pȝ需要有多少个用例?q是很多人在用例建模时会产生的疑惑。描q同一个系l,不同的h会生不同的用例模型。例如对于各U系l中常见?l护用户"用例Q它里面包含了添加用戗修改用户信息、删除用L操作Q这些操作在该用例的事g可以表q成为基本流的子事g?subflow)?/p>

l护用户-基本事g?/p>

该基本流׃个子事g构成:

1) d用户子事件流

2) 修改用户 子事件流

3) 删除用户子事件流

但是你也可以Ҏ该用例中的具体操作把它抽象成Z个用例,它所表示的系l需求和单个用例的模型是完全一L?/p>

应该如何定用例的粒度呢Q在一ơ技术研讨会上,有h问vIvar Jacoboson博士Q一个系l需要有多少个用例?大师的回{是20个,当然他的意思是最好将用例模型的规模控制在几十个用例左叻Iq样比较Ҏ来管理用例模型的复杂度。在用例个数大致定的条件下Q我们就很容易来定用例_度的大。对于较复杂的系l,我们需要控制用例模型一U的复杂度,所以可以将复杂度适当地移往每一个用例的内部Q也是让一个用例包含较多的需求信息量。对于比较简单的pȝQ我们则可以复杂度适度地曝露在模型一U,也就是我们可以将较复杂的用例分解成ؓ多个用例?/p>

用例的粒度不但决定了用例模型U的复杂度,而且也决定了每一个用例内部的复杂度。我们应该根据每个系l的具体情况Q因时因宜地来把握各个层ơ的复杂度,在尽可能保证整个用例模型的易理解性前提下军_用例的大和数目?/p>

5.3 用例?/span>

用例囄主要作用是描q参与者和用例之间的关p,单的pȝ中只需要有一个用例图可以把所有的关系都描q清楚。复杂的pȝ中可以有多个用例图,例如每个用例包都可以有一个独立的用例图来描述该用例包中所有的参与者和用例的关pR?/p>

在一个用例模型中Q如果参与者和用例之间存在着多对多的关系Qƈ且他们之间的关系比较复杂Q如果在同一个用例图中表q所有的参与者和用例显得不够清晎ͼq时我们可创建多个用例图来分别表C各U关pR?/p>

如果惌某一个参与者和多个用例的关p,你就可以以该参与者ؓ中心Q用一个用例图表述参与者和多个用例之间的关pR在q个用例图中Q我们强调的是该参与者会使用pȝ所提供的哪些服务?/p>

如果惌某一个用例和多个参与者之间的关系Q你可以以该用例ؓ中心Q用一个用例图表述用例和多个参与者之间的关系。在q个用例图中Q我们强调的是该用例会涉及到哪些参与者,或者说该用例所表示的系l服务有哪些使用者?/p>

M在用例徏模过E中Q你可以Ҏ自己的需要创ZQ意多个用例图Q用不同的用例来参与者和用例之间不同的关pR但是最重要的是要考虑整个用例模型的可理解性,如果可以用一个用例图把意思表q清楚,׃要再用第二个Q因是简z的模型易于理解?/p>

参考资?

  • 样例代码



  • Jeffrey Friedl, Mastering Regular Expressions, O'Reilly

  • Mendel Cooper, Advanced Bash-Scripting Guide

  • Michael Jang, Mastering Redhat 9


关于作?/span>

 

傅纯一QIBM中国有限公司软g部Rational中国区技术销售经?/p>



二胡 2009-03-10 12:04 发表评论
]]>
设计模式之Prototype(原型)http://www.tkk7.com/hulizhong/archive/2009/03/09/258563.html二胡二胡Mon, 09 Mar 2009 03:00:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/09/258563.htmlhttp://www.tkk7.com/hulizhong/comments/258563.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/09/258563.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/258563.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/258563.html

原型模式定义:
用原型实例指定创建对象的U类,q且通过拯q些原型创徏新的对象.

Prototype模式允许一个对象再创徏另外一个可定制的对象,Ҏ无需知道M如何创徏的细?工作原理?通过一个原型对象传l那个要发动创徏的对象,q个要发动创建的对象通过h原型对象拯它们自己来实施创建?/p>

如何使用?
因ؓJava中的提供clone()Ҏ来实现对象的克隆,所以Prototype模式实现一下子变得很简?

以勺子ؓ例:

public abstract class AbstractSpoon implements Cloneable
{
  String spoonName;

  public void setSpoonName(String spoonName) {this.spoonName = spoonName;}
  public String getSpoonName() {return this.spoonName;}

  public Object clone()
  {
    Object object = null;
    try {
      object = super.clone();
    } catch (CloneNotSupportedException exception) {
      System.err.println("AbstractSpoon is not Cloneable");
    }
    return object;
  }
}

有个具体实现(ConcretePrototype):

public class SoupSpoon extends AbstractSpoon
{
  public SoupSpoon()
  {
    setSpoonName("Soup Spoon");
  }
}

 

调用Prototype模式很简?

AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();

当然也可以结合工厂模式来创徏AbstractSpoon实例?/p>

在Java中Prototype模式变成clone()Ҏ的用,׃Java的纯z的面向对象Ҏ,使得在Java中用设计模式变得很自然Q两者已l几乎是然一体了。这反映在很多模式上Q如Interator遍历模式?/p>

二胡 2009-03-09 11:00 发表评论
]]>
设计模式之Templatehttp://www.tkk7.com/hulizhong/archive/2009/03/09/258562.html二胡二胡Mon, 09 Mar 2009 02:55:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/09/258562.htmlhttp://www.tkk7.com/hulizhong/comments/258562.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/09/258562.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/258562.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/258562.html

Template模板模式定义:
定义一个操作中法的骨?一些步骤的执行延迟到其子类?

使用Java的抽象类Ӟq怼使用到Template模式,因此Template模式使用很普?而且很容易理解和使用?/p>

 

public abstract class Benchmark
{
  /**
  * 下面操作是我们希望在子类中完?br />   */
  public abstract void benchmark();

  /**
  * 重复执行benchmarkơ数
  */
  public final long repeat (int count) {
    if (count <= 0)
      return 0;
    else {
      long startTime = System.currentTimeMillis();

    for (int i = 0; i < count; i++)
      benchmark();

    long stopTime = System.currentTimeMillis();
    return stopTime - startTime;
  }
}
}

在上例中,我们希望重复执行benchmark()操作,但是对benchmark()的具体内Ҏ有说?而是延迟到其子类中描q?

public class MethodBenchmark extends Benchmark
{
  /**
  * 真正定义benchmark内容
  */
  public void benchmark() {

    for (int i = 0; i < Integer.MAX_VALUE; i++){
      System.out.printtln("i="+i);    
    }
  }
}

x,Template模式已经完成,是不是很?

我们UrepeatҎ为模板方法, 它其中的benchmark()实现被gq到子类MethodBenchmark中实CQ?/p>

看看如何使用:

Benchmark operation = new MethodBenchmark();
long duration = operation.repeat(Integer.parseInt(args[0].trim()));
System.out.println("The operation took " + duration + " milliseconds");

 

也许你以前还疑惑抽象cL什么用,现在你应该彻底明白了? 至于q样做的好处,很显然啊,扩展性强,以后Benchmark内容变化,我只要再做一个承子cd可以,不必修改其他应用代码.



二胡 2009-03-09 10:55 发表评论
]]>
谈cȝ兌和依?/title><link>http://www.tkk7.com/hulizhong/archive/2009/03/06/258156.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Fri, 06 Mar 2009 03:25:00 GMT</pubDate><guid>http://www.tkk7.com/hulizhong/archive/2009/03/06/258156.html</guid><wfw:comment>http://www.tkk7.com/hulizhong/comments/258156.html</wfw:comment><comments>http://www.tkk7.com/hulizhong/archive/2009/03/06/258156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/hulizhong/comments/commentRss/258156.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/hulizhong/services/trackbacks/258156.html</trackback:ping><description><![CDATA[Q者的概念上的不同Q网上有很多文章Q我从代码实C说说Q者的不同<br />   兌Q如果Acȝ有个属性是Q类型,那么Q和Q就是关联关p(当然兌也分了几U:单向兌Q双向关联)<br />   依赖Q如果AcȝҎ的参数或Ҏ里的局部变量引用了Q类Q则是A依赖Q?br />   <br />   不对地方Q大家说_<img src ="http://www.tkk7.com/hulizhong/aggbug/258156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/hulizhong/" target="_blank">二胡</a> 2009-03-06 11:25 <a href="http://www.tkk7.com/hulizhong/archive/2009/03/06/258156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cȝl合和类的聚合的区别http://www.tkk7.com/hulizhong/archive/2009/03/06/258150.html二胡二胡Fri, 06 Mar 2009 03:07:00 GMThttp://www.tkk7.com/hulizhong/archive/2009/03/06/258150.htmlhttp://www.tkk7.com/hulizhong/comments/258150.htmlhttp://www.tkk7.com/hulizhong/archive/2009/03/06/258150.html#Feedback0http://www.tkk7.com/hulizhong/comments/commentRss/258150.htmlhttp://www.tkk7.com/hulizhong/services/trackbacks/258150.html l合: 被拥有者是拥有者的一个组成部?被拥有者的生命周期和拥有者的有强相关关系.也就是说当拥有者生命周期结束的时?被拥有者也消亡?常用于黑色实心菱形表C?
      例如:人死?毛发也不存在?
聚合:表示事物的整?部分关系的较弱情?常用于空心实心菱形表C?br />

      个h认ؓ:做设计的时?不要专注l节.呵呵,不知道观点对?

二胡 2009-03-06 11:07 发表评论
]]>
վ֩ģ壺 | ӰԺ߹ۿ| Ʒ޹| 츾Ļʮг| Ƶѹۿwww| AV˾Ʒպһ| ŷ޹ۺ| þù޵Ӱ| ľƷAVƬ| ޹ҹĻƷվ| ھƷ뿨123| պƵ߹ۿ| Ļձ| Ʒ鶹123| ޾ƷƷɫ| Ļ˿Ʒһ| Ѵ߹| ˵Ƶ߹ۿ | պһ߲ѹۿ| ѹۿɫƵվbd| þѵľƷV| ҰƵѹۿȫ | һƵ| һaƬþëƬ| ҹAëƬ| ëƬվ߹ۿ| ŷͬgvվۿ | 91ۺ| 91Ƶ߹ۿ| þ޹˾Ʒ| ߹ۿ㶮| av벻˽ӰԺ| ޹ҹĻƷվ| avtt| ˵va| ƷV޾ƷVպƷ| þþþƷ޳18վ | ƷþƵ| һƬaƵѹۿ| ާžƷ| պɬɬҹ˽ӰԺ|