概要
- 类图以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法。
- 类图中的“类”与面向对象语言中的“类”的概念是对应的,是对现实世界中的事物的抽象。
元素解析
类
- 从上到下分为三部分,分别是类名、属性和操作。类名是必须有的
- 类如果有属性,则每一个属性都必须有一个名字,另外还可以有其它的描述信息,如可见性、数据类型、缺省值等
- 类如果有操作,则每一个操作也都有一个名字,其它可选的信息包括可见性、参数的名字、参数类型、参数缺省值和操作的返回值的类型等
属性和方法:
- private:成员前有一个“-”号,表示成员私有
- public: 成员前有一个“+”号,表示成员公开
- protected:成员前有一个“#”号,表示成员受保护的
- package:成员前有一个“~”号,表示成员包可见
例如
public abstract class Vehicle
{
public abstract int Start();
public abstract int Stop();
public abstract int Run(float fSpeed);
private float fMaxSpeed;
}
接口
一组操作的集合,只有操作的声明而没有实现
抽象类
不能被实例化的类,一般至少包含一个抽象操作
模板类
一种参数化的类,在编译时把模版参数绑定到不同的数据类型,从而产生不同的类
关系解析
关联关系
描述了类的结构之间的关系。具有方向、名字、角色和多重性等信息。一般的关联关系语义较弱。也有两种语义较强,分别是聚合与组合。
例如
public class Dialog{
private Button btnOK;
private Button btnCancel;
private TextBox txtInfo;
}
public class Button{
...
}
public class TextBox{
...
}
聚合关系
特殊关联关系,指明一个聚集(整体)和组成部分之间的关系,箭头指向部分,菱形指向整体。
聚合关系整体与部分的生命周期是可以不一致的,且部分可以脱离整体存在。
// 汽车类
public class Car {
private Engine engine = null; // 一辆车存在一个引擎
private List<Tyre> tyres = null; // 一辆车存在四个车轮
}
// 引擎类
class Engine {
...
}
// 轮胎类
class Tyre {
...
}
组合关系
语义更强的聚合,部分和整体具有相同的生命周期,箭头指向部分,菱形指向整体。
// 人类
public class Person {
private Head head = null; // 一个人有一个大脑
private List<Hand> hands = null; // 一个人有一双手
}
// 大脑类
class Head {
...
}
// 手类
class Tyre {
...
}
泛化关系
在面向对象中一般称为继承关系,存在于父类与子类、父接口与子接口之间
例如
public class SavingsAccount extends Account{
...
}
实现关系
对应于类和接口之间的关系
例如
// Shape类
public interface Shape{
public abstract void Draw();
}
// Circle类
public class Circle implements Shape{
public void Draw();
private Point ptCenter;
private int nRadius;
}
依赖关系
描述了一个类的变化对依赖于它的类产生影响的情况。有多种表现形式,例如绑定(bind)、友元(friend)等
例如
class FloatStack{
private int size;
public int Push(float elem);
public int Pop();
public float GetTop();
}
常用例子
图形编辑器
- 图形编辑器一般都具有一些基本图形,如直线、矩形等,用户可以直接使用基本图形画图,也可以把基本图形组合在一起创建复杂图形
- 如果区别对待基本图形和组合图形,会使代码变得复杂,而且多数情况下用户认为二者是一样的
- 组合模式可以用相同的方式处理两种图形
演出售票系统
在用例驱动的开发过程中,通过分析各个用例及参与者得到类图。分析用例图的过程中需要根据面向对象的原则设计类和关系,根据用例的细节设计类的属性和操作