设计模式前篇之UML类图快速入门

UML即统一建模语言:面向对象开发系统的产品进行说明、可视化、和编制文档的标准语言

一.UML图分类

众所周知,UML图可以分为以下几种图:

  • 类图:是用来描述系统中的类以及各个类之间的关系
  • 对象图:对象图描述的是一组对象之间的关系,而不是类之间的关系。它是类图的变体,但是又与之不同,对象显示的类的多个对象而不是实际的类
  • 用例图:是需求分析的产物,主要是用来描述用户是如何使用一个系统的,是用户所能观察和使用到的系统功能的模型图
  • 交互图:一种作用于显示对象之间如何进行交互以执行特点用例或用例中特点部分行为的交互图,它强调的是发送和接收消息的对象之间的组织结构
  • 时序图:又叫序列图或者顺序图,是一种用来描述对象之间传送消息的时间顺序,是用来表示用例中的行为顺序
  • 状态图:用于显示状态机,即描述一个对象所处的可能状态以及状态之间的转移
  • 活动图:是UML的动态模型的一种图形,对于系统的功能建模特别重要。它用来描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动。简单来讲,就是表示在处理某个活动时,两个或者更多类对象之间的过程控制流
  • 组件图:又叫构件图,是用来描述在软件系统中遵从并实现一组接口的物力的、可替换的软件模块
  • 部署图:一个用来描述系统的硬件配置和部署以及软件的构件和模块在不同节点上分布的模型图

二.UML类图

类图就是为了描述面向对象中的类的结构的

1.类图内部结构

类图内部结构

  • 类名
    • 普通类
    • 抽象类:类名使用斜体
    • 接口:使用<<interface>>
  • 属性
    • 类(静态)属性:属性名称前加_(下划线)
    • 属性类型:在属性后面:然后添加属性的数据类型
  • 方法(操作)
    • 类(静态)方法:方法名前加_(下划线)
    • 方法返回类型:在方法名称为:数据类型
  • 访问权限:类/属性/方法都有访问权限
    • + :表示public权限
    • - : 表示private权限
    • ~ : 表示默认权限
    • # : 表示protected权限

类图

如:一个开发者类

  1. public class Developer {
  2. private String name;
  3. public String title;
  4. int age;
  5. protected String DEPARTMENT = "develop";
  6. public Developer(String name) {
  7. this.name = name;
  8. }
  9. public String getName() {
  10. return this.name;
  11. }
  12. protected void setName(String name) {
  13. this.name = value;
  14. }
  15. }

对应上面代码的UML类图为:

类图

2.类图之间的外部关系

类图之间的关系

注:类图,都是由子类指向父类,因为子类明确知道它继承自哪个类,而父类就不知道哪个子类继承了它

(1)泛化(Generalization):即继承关系
  • 定义:泛化关系就是继承关系,也称is-a的关系,它是描述父类与子类之间的关系,如鸟类继承自动物类,可以称鸟是一种动物
  • 实例:类A是类B和类C的父类,那么B和C具有公共类(父类)A,可说A是B,C的一般化(概括或泛化)
  • 表示方法:实线 + 空心三角
  • 例子:
  1. /**
  2. * 鸟类
  3. * @author shixinke
  4. */
  5. public abstract class Bird {
  6. /**
  7. * 鸟都会鸣叫
  8. */
  9. public void say() {
  10. System.out.println("说话");
  11. }
  12. /**
  13. * 飞翔
  14. */
  15. public abstract void fly();
  16. }
  17. /**
  18. * 鸡类(鸡也是一种鸟)
  19. * @author shixinke
  20. */
  21. public class Chicken extends Bird {
  22. public void fly() {
  23. System.out.println("鸡在跳跃式的飞翔");
  24. }
  25. }
  26. /**
  27. * 鸽子(也是一种鸟)
  28. * @author shixinke
  29. */
  30. public class Dove extends Bird {
  31. public void fly() {
  32. System.out.println("鸽子在天空中翱翔");
  33. }
  34. }

这三个类的UML关系图如下:

泛化关系

(2)实现(Implementtaion):即实现接口
  • 定义:用来规定接口和实线接口的类或者构建结构的关系,接口是操作的集合,而这些操作就用于规定类或者构建的一种服务
  • 实例:A类实现了某个B接口
  • 表示方法:虚线 + 空心三角
  • 例子:
  1. /**
  2. * 可计算的接口
  3. * @author shixinke
  4. */
  5. public interface Computable {
  6. /**
  7. * 计算
  8. */
  9. void compute();
  10. }
  11. /**
  12. * 计算器
  13. * @author shixinke
  14. */
  15. public class Calculator implements Computable {
  16. public void compute() {
  17. System.out.println("使用计算器计算");
  18. }
  19. }
  20. /**
  21. * 计算机
  22. * @author shixinke
  23. */
  24. public class Computer implements Computable {
  25. public void compute() {
  26. System.out.println("使用计算机计算");
  27. }
  28. }

这三个类的UML关系

实现关系

(3)关联(Association)
  • 定义:是一种拥有的关系, 它使一个类知道另一个类的属性和方法
  • 实例:类A中有一个实例变量为类B的实例(一般表现为一个类的实例变量)
  • 表示方法:实线+箭头
  • 例子:
  1. /**
  2. * 数据库连接类
  3. * @author shixinke
  4. */
  5. public class DbConnection {
  6. public DbConnection() {
  7. System.out.println("连接数据库");
  8. }
  9. public void execute(String sql) {
  10. System.out.println("执行sql操作");
  11. }
  12. }
  13. /**
  14. * 数据库操作模型
  15. * @author shixinke
  16. */
  17. public class Model {
  18. private DbConnection dbConnection;
  19. public Model(DbConnection connection) {
  20. this.dbConnection = connection;
  21. }
  22. /**
  23. * 插入操作
  24. * @return
  25. */
  26. public boolean insert() {
  27. this.dbConnection.execute("INSERT INTO....");
  28. return true;
  29. }
  30. }

这两个类的UML关系

关联关系

(4)聚合(Aggregation)
  • 定义:个体与群体之间的关系(整体与个体之间的关联关系,两者是可以分离的)
  • 实例:单个学生与学生列表
  • 表示方法:实线+空心菱形
  • 例子:
  1. /**
  2. * 学生
  3. */
  4. public class Student {
  5. /**
  6. * 学号
  7. */
  8. private String studentNo;
  9. /**
  10. * 姓名
  11. */
  12. private String name;
  13. }
  14. /**
  15. * 学生列表
  16. * @author shixinke
  17. */
  18. public class StudentList {
  19. private List<Student> students;
  20. }

以上两个类的UML关系图:

聚合关系

(5)组合(Composition)
  • 定义:整体与部分的关系,而且是不可分开的
  • 实例:电脑及其内部组件
  • 表示方法:实线+实心菱形
  • 例子:
  1. /**
  2. * CPU
  3. * @author shixinke
  4. */
  5. public class CPU {
  6. /**
  7. * 型号
  8. */
  9. private String model;
  10. }
  11. /**
  12. * 硬盘
  13. * @author shixinke
  14. */
  15. public class Disk {
  16. /**
  17. * 容量
  18. */
  19. private Long capacity;
  20. }
  21. /**
  22. * 内存
  23. * @author shixinke
  24. */
  25. public class Memory {
  26. /**
  27. * 规格
  28. */
  29. private String specification;
  30. }
  31. /**
  32. * 主板
  33. * @author shixinke
  34. */
  35. public class MotherBoard {
  36. }
  37. /**
  38. * 电脑(由CPU、硬盘、内存、主板等部件组成,其他像机箱、电源等就不再赘述)
  39. * @author shixinke
  40. */
  41. public class Computer {
  42. /**
  43. * CPU
  44. */
  45. private CPU cpu;
  46. /**
  47. * 硬盘
  48. */
  49. private Disk disk;
  50. /**
  51. * 内存
  52. */
  53. private Memory memory;
  54. /**
  55. * 主板
  56. */
  57. private MotherBoard motherBoard;
  58. }

这些部件与电脑的关系:

组合关系

(6)依赖(Dependency)
  • 定义:是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系
  • 实例:假设A类的变化引起了B类的变化,则说名B类依赖于A类(方法中的参数)
  • 表示方法:虚线箭头
  • 例子:
  1. /**
  2. * 价格服务
  3. * @author shixinke
  4. */
  5. public class Price {
  6. public BigDecimal getProductPrice(Long productId) {
  7. Map<Long, BigDecimal> priceMap = new HashMap<Long, BigDecimal>(2);
  8. priceMap.put(1L, new BigDecimal(200));
  9. priceMap.put(2L, new BigDecimal(500));
  10. return priceMap.get(productId);
  11. }
  12. }
  13. /**
  14. * 商品类
  15. * @author shixinke
  16. */
  17. public class Product {
  18. private String name;
  19. private Long productId;
  20. private Price price;
  21. public Product() {
  22. price = new Price();
  23. }
  24. public BigDecimal getPrice() {
  25. return this.price.getProductPrice(this.productId);
  26. }
  27. }

商品类与价格类之间的关系:

依赖关系