设计模式--UML类图
类和接口
类图
class Animal {
};
动物矩形框,它就代表一个类( Class)。
类图分三层:
- 第一层显示类的名称,如果是抽象类,则就用斜体显示。
- 第二层是类的特性,通常就是字段和属性。
- 第三层是类的操作,通常是方法或行为。注意前面的符号,‘+’表示 public,‘-’表示 private,‘#’表示 protected
接口
interface IFly {
void Fly();
};
interface ILanguage {
void Speak();
};
然后注意左下角的‘飞翔’,它表示一个接口图,与类图的区别主要是顶端有<< interface>>显示。
- 第一行是接口名称
- 第二行是接口方法。
接口还有另一种表示方法,俗称棒棒糖表示法,就是唐老鸭类实现了‘讲人话’的接口。
设计模式中的六种关系
继承
class Bird : Animal { // 继承动物类
};
继承关系用空心三角形+实线来表示
实现
class WideGoose : IFly { // 实现飞翔接口
};
举的几种鸟中,大雁是最能飞的,让它实现了飞翔接口。实现接口用空心三角形+虚线来表示。
组合
class Bird {
private Wing wing;
publice Bird() {
// 在鸟Bird类中,初始化时,实例化翅膀Wing,它们之间同时生成
wing = new Wing();
}
};
组合( Composition)是一种强的‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。
在这里鸟和其翅膀就是组合关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。组合关系用实心的菱形+实线箭头来表示。
另外,你会注意到合成关系的连线两端还有一个数字‘1和数字“2,这被称为基数。表明这一端的类可以有几个实例,很显然,一个鸟应该有两只翅膀。如果一个类可能有无数个实例,则就用n’来表示。关联关系、聚合关系也可以有基数的
聚合
class WideGooseAggregate {
private WideGoose[] arrayWideGoose; // 在雁群WideGooseAggregate类中,有大雁数组对象arrayWideGoose
};
再来看大雁与雁群这两个类,大雁是群居动物,每只大雁都是属于一个雁群,一个雁群可以有多只大雁。所以它们之间就满足聚合( Aggregation)关系。聚合表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。聚合关系用空心的菱形+实线箭头来表示。
组合和聚合的关系
组合:整体与部分之间的强关系,部分随着整体生命周期的结束而结束(部分不能脱离整体单独存在)。 eg: 鸟(整体)与 翅膀(部分)
part-of 关系,父类拥有子类,子类不能独立与父类存在
聚合:整体与部分之前的弱关系,部分不会随着整体生命周期的结束而结束。eg:电脑(整体)与 鼠标(部分)
has -a 关系,父类包含子类,但子类可以独立存在
一组关联关系是聚合还是组合,要根据实际业务来看,两个类,在不同的场景中可以有不同的关联关系
关联
class Penguin : Bird {
private Climate climate; // 在企鹅Peginun中,引用到气候Climate对象
};
企鹅和气候两个类,企鹅是很特别的鸟,会游不会飞。更重要的是,它与气候有很大的关联。我们不去讨论为什么北极没有企鹅,为什么它们要每年长途跋涉。总之,企鹅需要‘知道’气候的变化,需要‘了解’气候规律。当一个类‘知道’另一个类时,可以用关联( association)。关联关系用实线箭头来表示。
依赖
abstract class Animal {
public Metabolism(Oxygen oxygen, Water water) {
}
};
动物几大特征,比如有新陈代谢,能繁殖。而动物要有生命力,需要氧气、水以及食物等。也就是说,动物依赖于氧气和水。他们之间是依赖关系( Dependency),用虚线箭头来表示。
关联和依赖的关系
关联和依赖是面向对象设计中的两种不同关系,它们在类图中用来表示不同的概念。关联表示类之间的连接,而依赖表示一个类依赖于另一个类。下面是关联和依赖的更详细解释:
- 关联(Association):关联表示类之间的连接,它描述了一个类对象和另一个类对象之间的关系。关联可以是双向的,也可以是单向的。在类图中,关联通常用一条直线表示,箭头指向被关联的类。例如,一个学生类和一个课程类之间的关联表示学生选修了某门课程。
- 依赖(Dependency):依赖表示一个类依赖于另一个类。这种依赖通常是暂时性的,一个类的变化可能会影响到另一个类。在类图中,依赖通常用一条虚线表示,箭头指向被依赖的类。例如,一个订单类的生成可能依赖于一个支付类。
组合、聚合、关联的区别
组合、聚合、关联 是对象之间的三种关系,从某种意义上说,继承是一种类的纵向关系,而聚合,关联,组合是对象的横向关系。
组合:你和你的心脏之间是composition关系(心脏只属于自己)
聚合:你和你买的书之间是aggregation关系(书可能是别人的)
关联:你和你的朋友之间是association关系
其关系强弱为:组合 > 聚合 > 关联 > 依赖