在画类图之前,我们要理清UML中的四中关系,常见的有以下四种关系:泛化(Generalization), 实现(Realization),关联(Association),依赖(Dependency),而在关联中又包括:聚合(Aggregation),组合(Composition)
以下是简单的例子来说明四种关系如何在代码(应用)中体现:
实现接口:大雁实现飞翔
继承:动物和鸟
关联:企鹅和气候
聚合:雁群和大雁
组合:鸟和翅膀
依赖:动物和氧气
实现接口:
代码体现:
interface IFlay
{
void Speak();
}
class WideGoose:IFlay
{}
泛化(继承)
代码体现(以下也体现了多态)
abstract class Animal
{
public abstract 数据类型 方法名(参数);
}
class Bird:Animal
{
public override 数据类型 方法名(参数);
}
关联
关联是最弱的关系,只引用了单个对象
代码体现(也有this的情况)
class Penguin:Bird
{
private Climate climate;
}
聚合
表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分(引用了对象数组---多个或抽象类)
(是一种遍历,将继承父类的子类遍历一遍,可以全部遍历也可以不全部遍历,还可以根据条件不同,调用相应的子类中的代码;代码体现在this.X,关联也会有this,这时候要判断一个还是多个(或父类),一个则是关联,多个或父子类则是聚合)
例一
:
代码体现
class WideGooseAggregate
{
private WideGoose[] ArrayWideGoose;
}
例二:
public class Waiter
{
private Command command;
public void SetOrder(Command command)
{
this.command=command;
}
合成(组合)
是一种强‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样
(是一种生成你就要生成我的关系,体现在一个类X中的构造函数中是否实例化了另一个类Y,如果把Y全部的子类实例化则为合成,如果只生成了Y的一部分,则不为合成,可能是聚合)
代码体现(不仅要引用,还要在构造函数中实例化,使他们之间同时生成)
class Bird
{
private Wing wing;
public Bird()
{
wing=new wing();
}
}
依赖
动物要生存就要依赖于氧气和水
例子一:
代码体现(氧气为动物的构造函数中的参数,,没有引用)
abstract Class Animal
{
public Metabolism(Oxygen oxygen)
{
}
}
例二:(返回值的类型为被引用的类的父类)
class SqlServerFactory:IFactory
{
public IUser CreateUser()
{
return new SqlserverUser()
}
}
关联---引用对象的数量与是否在构造函数中实例化,使用引用的参数
依赖---构造函数中的参数,不是引用的参数,可能是类中本身(this),或是从客户端传进来的参数但是这个方法的数据类型就是指向方向的那个类的类型,或者参数引用的就是指向方向的那个类的类型
泛化(继承)---父与子的关系(:符号)
实现:一种独立功能的实现(:符号)
小技巧:箭头指向的一方是被引用