类图中表达总体与局部的关系_UML-类图
概念
Class diagram is UML structure diagram which shows structure of the designed system at the level of classes and interfaces, shows their features, constraints and relationships - associations, generalizations, dependencies, etc.
类图是⽤于描述类、接⼝这⼀层次的图形,他表达了类、接⼝的功能、约束以及他们之间的关系。
使⽤场景
类图是适⽤于⾯向对象进⾏建模的场景,通过类图,我们能够知道我们对系统被抽象成了哪些类,以及他们之间的关系。因此,类图适⽤于使⽤⾯向对象的⽅法进⾏设计的系统、应⽤。
对于后端来说,⼀般类图常⽤于单⼀的系统内,对于微服务这类分布式架构的表达,更适⽤于组件图或者部署图。 对于前端来说,由于 js 的语⾔特性,以及react、vue 这类组件化框架⼤⾏其道,简单的业务场景就不需要使⽤到类图了,基于⾯向对象建模反⽽是过度设计,此时⽤组件图表达即可。但是当业务复杂到到⼀定程度,不得不使⽤⾯向对象对业务层进⾏建模时,类图就有意义了。
类图元素
类(class)
类是⾯向对象的概念,是描述⼀系列对象共有的功能和约束 对于类来说,功能即类的属性以及⽅法,约束即属性及⽅法的可见性。
接⼝(interface)
接⼝描述的是功能的合集,⼀般我们会对功能进⾏分类,同⼀类别的功能统⼀放在⼀个接⼝⾥,⽤接⼝来描述功能的抽象,以此来增强接⼝的可复⽤性。 ⽐如 cloneable 接⼝,表述实现了这个接⼝的类
是⽀持 clone 相关的⾏为的。接⼝和类最⼤的不同在于接⼝只描述⾏为,表达的是能⼒,⽐如 cloneable 接⼝,表达的是 clone 的能⼒,具体怎么 clone (如何实现)是在类的范畴,因此接⼝的抽象程度更⾼。
因为接⼝是⼀个⾼度的抽象,因此接⼝需要有实际的载体,也就是类,所以接⼝是需要配合类来⼀起表达才能有实际的含义,因此声明了接⼝后,还需要表明谁来实现,或者相关的依赖。
类图关系
类的基本元素⽐较简单,难点在于关系的表达。业务之所以复杂,不是因为业务中可以抽象出多个类,⽽是类之间的关系,每个类的变动都可能牵扯到其他部分,业务⾏为正是通过这些”牵扯“组成的。因此我们使⽤⾯向对象建模,核⼼的⽬的在于让关系变得简单,简单意味着可控,业务⾏为便可预测。
本章节不会把所有的关系全部说清楚,只会讲到平时开发过程中常见的 5 种关系线,他们的含义以及⽤法。
依赖(dependency)
⾏为与另⼀个类有相关性。 敲⿊板!依赖关系是⾏为之间产⽣关联
依赖关系是⾏为之间产⽣关联
两个对象间最弱的关系,表⽰⼀个类的某些⾏为
A 依赖
B 的三种场景:
class A {
function fn(B b) { }
function fn2() {
B b = new B()
}
function fn3() {
return new B()
}
}
泛化(generalization)
通常指⼀个类(或接⼝)继承另⼀个类(或接⼝),并可以增加它⾃⼰的新功能的能⼒。
A 继承类
B 实现 I
C 接⼝:
class A extends B implements IC { }
关联(association)
⼆元关系,表⽰对象与对象之间有持有关系
单向关联关系,A 关联 B :
class A {
B b
}
class B { }
双向关联关系,A 与 B 互相关联:
class A {
B b
}
class B {
A a
}
聚合(aggression)
含义更明确的单向关联关系,表⽰体与个体的关系。体解散了,个体可能还会存活。 聚合关系强调了对象间⽣命周期的关系,聚合的对象是有各⾃独⽴的⽣命周期的。
class A {
B b
constructor(B _b) {
this.b = _b
}
setB(B b) {
this.b = b
}
}
组合(composition)
和聚合关系类似,属于更明确的关联关系,表⽰全体和局部的关系。全体不存在了,局部也不存在了(或没有意义了),和聚合的区别在于声明周期的不同。
class A {
B b分布式和微服务的关系
constructor() {
this.b = new B()
}
}
⼩结
我们讲的 5 种关系,都属于⼆元关系,区别在于使⽤的时机与⽣命周期的不同。依赖与关联的区别在于依赖仅是在⾏为上会使⽤到另⼀个类,⽽关联则是需要持有对象,会影响对象的⽣命周期。 聚合与组合是提出了更明确含义的关联关系,区别在于聚合的对象,⽣命周期是各⾃独⽴的,组合的对象,⽣命周期跟随整体。
要注意的是,关系是对现实事务的表达,因此关系本⾝也是有语义的。为了⽅便理解,我们使⽤对象声明周期的影响来区分依赖与关联,聚合与组合,但是这个只是充分⾮必要条件,不能狭隘的通过⽣命周期来反推关系
总结
UML的类图是从程序逻辑层⾯上来表达系统设计的⽅法
类图是⼀种静态图,描述的是系统的静态结构
依赖关系,表达的是基于对象⾏为上的关联
关联关系,表达的是对象间的持有关系,影响对象的⽣命周期
聚合关系表达的是体和个体的关系,删除了体,可能不影响个体的⽣命周期
组合关系表达的是整体和局部的关系,删除了整体,局部随之消亡
思考题
企业与员⼯是什么关系?
企业与个⼈是什么关系?
⼯⼚类与被⽣成的类是什么关系?如果是⽀持缓存的⼯⼚类呢?ML
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论