热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解UML用例图中的关系:包含与扩展

本文详细探讨了UML用例图中的两种重要关系——包含关系和扩展关系,通过具体示例解析这两种关系的应用场景及其实现方式。

在UML建模中,用例图是一种用于描述系统功能需求的图形化工具。本文将重点讨论用例图中的两种关键关系:包含关系(Include)和扩展关系(Extend),并提供具体的例子来加深理解。



参与者与用例的关系


参与者与用例之间的关系是指参与者如何与系统交互,以完成特定的任务。这种关系通常表现为参与者触发或参与某个用例的过程。



用例之间的关系



包含关系(Include)


包含关系表示一个用例在执行过程中必须调用另一个用例。这通常发生在多个用例共享相同的功能时。例如,在一个图书管理系统中,无论是借书还是还书,都需要检查书籍是否逾期。



概念: 包含关系确保了一个用例的功能可以通过调用另一个用例来实现,从而避免重复代码,提高系统的可维护性。



表示符号: 包含关系用带有箭头的虚线表示,箭头指向被包含的用例,并标记为<>。



使用场合:



  • 当多个用例中有重复的功能时,可以将这些功能提取到一个单独的用例中,并通过包含关系将其引入其他用例。

  • 当一个用例的功能过于复杂时,可以将其拆分为多个较小的用例,通过包含关系进行组织。



代码示例:


class Coat // 外套
{
public string Name { get; set; }
public double Price { get; set; }

public Coat(string name, double price)
{
Name = name;
Price = price;
}

public void Pay()
{
Discount();
Console.WriteLine("该件外套的应付款为:{0}", Price);
}

public void Discount()
{
Price *= 0.8;
}
}

class Program
{
static void Main(string[] args)
{
Coat myCoat = new Coat("劲霸", 1000);
Console.WriteLine("该外套的名称为:{0}", myCoat.Name);
Console.WriteLine("该外套的原价为:{0}", myCoat.Price);
myCoat.Pay();
}
}


扩展关系(Extend)


扩展关系允许一个用例在特定条件下扩展另一个用例的行为。这通常用于处理可选的或条件性的功能。例如,在一个订单管理系统中,普通支付流程可以在满足一定条件时(如金额超过某个阈值)应用折扣。



概念: 扩展关系允许一个用例在特定条件下增加额外的行为,而不改变基本用例的核心逻辑。



表示符号: 扩展关系用带有箭头的虚线表示,箭头从扩展用例指向基本用例,并标记为<>。



使用场合:



  • 当某些功能仅在特定条件下才需要执行时,可以将这些功能放在扩展用例中。

  • 将常规操作放在基本用例中,将特殊操作放在扩展用例中,以保持用例图的清晰和简洁。



代码示例:


class Coat // 外套
{
public string Name { get; set; }
public float Price { get; set; }

public Coat(string name, float price)
{
Name = name;
Price = price;
}

public void Pay()
{
if (Price > 800)
Discount(0.9f);
Console.WriteLine("该件外套的应付款为:{0}", Price);
}

public void Discount(float x)
{
Price *= x;
}
}

class Program
{
static void Main(string[] args)
{
Coat myCoat = new Coat("劲霸", 1000);
Console.WriteLine("该外套的名称为:{0}", myCoat.Name);
Console.WriteLine("该外套的原价为:{0}", myCoat.Price);
myCoat.Pay();
}
}


总结


通过本文的介绍,我们了解了UML用例图中的包含关系和扩展关系。这两种关系在建模系统功能时非常重要,能够帮助我们更好地组织和管理用例,提高系统的可维护性和可扩展性。



在实际应用中,区分包含关系和扩展关系的关键在于理解每个关系的语义和使用场景。包含关系用于处理重复的功能,而扩展关系用于处理可选的或条件性的功能。


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文整理了一系列Java面试问题,涵盖Java开发环境的分类、Java语言的核心特性、Linux环境下Java SE的安装步骤、常用的Java开发工具介绍,以及类与对象的基本概念等。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文介绍了如何通过扩展 UnityGUI 创建自定义和复合控件,以满足特定的用户界面需求。内容涵盖简单和静态复合控件的实现,并展示了如何创建复杂的 RGB 滑块。 ... [详细]
  • Java编程实践:深入理解方法重载
    本文介绍了Java中方法重载的概念及其应用。通过多个示例,详细讲解了如何在同一类中定义具有相同名称但不同参数列表的方法,以实现更灵活的功能调用。 ... [详细]
  • 本文详细介绍如何在VSCode中配置自定义代码片段,使其具备与IDEA相似的代码生成快捷键功能。通过具体的Java和HTML代码片段示例,展示配置步骤及效果。 ... [详细]
  • dotnet 通过 Elmish.WPF 使用 F# 编写 WPF 应用
    本文来安利大家一个有趣而且强大的库,通过F#和C#混合编程编写WPF应用,可以在WPF中使用到F#强大的数据处理能力在GitHub上完全开源Elmis ... [详细]
author-avatar
龙鹰的天涯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有