UML类图用英雄联盟里的例子理解
类图是一种用于描述系统结构的图形化表示方式,展示了系统中的类、它们的属性、方法,以及类与类之间的关系。它是面向对象分析和设计中常用的工具,帮助开发者清晰地了解系统的类的内容和类与类直接的关联关系。
类结构介绍
首先类图的基本结构有类名,属性,方法。
以上图片代表了一个minion(小兵)类
其中有五个属性分别是private修饰的int类型 health(血量)、public修饰的int类型的attackDamage(攻击力)、protect修饰的float类型的armor、package修饰的float类型的magicResist(魔法抗性)和public static修饰的int类型的静态属性totalMinionCount(小兵数量)
还有public 修饰的返回类型为void的attack()(攻击)方法
private 修饰的返回值类型为void需要传递类型为int的形参takeDamage(int)(受到攻击)方法
public static修饰的返回值类型int的静态方法getMinionCount()(获取全部小兵数量)
修饰符
___为static静态方法
+ 为public修饰符
- 为private修饰符
# 为protect修饰符
~ 为package修饰符
类型
接口
接口类型会有一个<<interface>>标识
抽象类
抽象类的声明方法是类名为斜体,抽象方法的表示方式也是斜体
属性
类图中表达属性的通用公式为:修饰符 属性名: 属性类型
方法
类图中表达方法的通用公式为:修饰符 方法名(形参类型): 返回值类型
类与类之间的关系介绍
类与类之间有六种关系从耦合度由低到高:依赖<关联<聚合<组合<实现=继承
依赖
依赖的关系用虚线箭头表达,调用类指向被依赖类
依赖的意思是一个类中的需要临时使用一个类,或者说一个类需要借助另外一个类完成某件事情。比如说英雄联盟里面的英雄喝血药。
类图里面的表达方式就是
usePotion()这个方法需要依赖Potion药水类才能运行,英雄需要调用usePotion方法回复血量,将Potion药水类作为参数传递,进行加血加蓝。并且药水可以作为父类,子类可以是腐败药水,血瓶,钢铁合剂等等
关联
关联的关系用实现箭头表达
关联是指两个对象之间的一种联系,表明它们之间存在某种程度的协作或关系。例如,一个订单对象可能与多个商品对象相关联,表示一个订单包含多个商品。其实关联也是一种强烈的依赖关系。
举一个英雄联盟里面的例子,英雄和装备的例子因为英雄可以购买并使用装备,但装备本身并不“属于”某个特定英雄。每个英雄在游戏过程中可以装备多个物品,并且这些装备会对英雄的能力产生影响
类图里面的表达方式就是
并且关联不仅有单向关联还有双向关联,双向关联请大家发挥自己想象力思考思考,这里就不作解释了
聚合
聚合的关系用空心菱形表达
聚合是一种表示 整体与部分 关系的面向对象设计概念,通常用于类与类之间的关系建模。在聚合关系中,整体 和 部分 是相对独立的,部分可以独立于整体存在,即使整体对象被销毁,部分对象仍然可以继续存在。
说人话举个例子就是英雄联盟里面队伍和英雄的关系,一个队伍里面有五个英雄他们之间的关系是聚合
有同学就会说了,那关联关系不是和聚合关系一模一样的。其实不是的
聚合 强调的是一种 整体与部分 的关系,部分可以独立存在
关联 则只表示两个对象之间的联系或交互,关联中的对象彼此独立,没有“整体-部分”的概念。
就比如说有些人会说我怎么会没有用,没我还开不了这把游戏呢!!所有英雄和队伍的关系是部分和整体的关系所以是聚合关系。但是不会有人因为英雄不出装备而开不了游戏所以英雄和装备的关系是关联关系。
组合关系
组合的关系用实心菱形表达
组合是一种表示 整体与部分 关系的面向对象设计概念。它是比聚合更强的一种关系,强调了部分和整体之间的强依赖关系。在组合关系中,部分的生命周期依赖于整体,即整体对象的生命周期决定了部分对象的生命周期。
举个例子英雄联盟里面有一个英雄是叫蝎子他的大招是压制效果,蝎子和他的大招关系就是组合关系
有同学又要说了这组合关系和聚合又有什么区别呢
组合是一种更强烈的聚合,如果主体不存在的时候部分也不在存在,比如说蝎子给重做了以后他的大招也就没有了。所以说英雄联盟蝎子重做的时候出现了很多bug因为蝎子大招是很多技能的父类,蝎子重做大招没有了就要改动很多代码。但是聚合就不一样了,一个team解散了,里面的英雄不会给删除。就是这个意思
继承
继承的关系用实线空心三角表达
继承(也称为泛化)用于表示一个类从另一个类继承属性和方法的关系。被继承的类称为父类,继承的类称为子类。这种关系表明子类继承了父类的特性,并且可以扩展或重写这些特性。
其实就是java里面继承的定义
实现
实现的关系用虚线空心三角形表达
接口定义了一组方法,但没有实现这些方法的具体代码。接口可以被多个类实现,提供不同的实现细节。一个类实现了一个接口时,意味着这个类提供了接口中所有方法的具体实现。实现类必须遵循接口定义的方法签名和规范。
也就是java里面实现的定义