UML 类图简单入门使用教程(基本组成,关系,代码实例,案例分析)

一、(了解)3种类:

通常类分为实体类,控制类和边界类

1. 实体类

实体类对应需求中的实体,通常保存到永久储存体中,一般使用数据库的表或者文件来储存记录,包括储存数据的类、传递数据的类、操作数据的类。实体类一般是名词比如:商品、用户。

2. 控制类:

控制类实现程序的执行逻辑,提供相应的业务操作,将控制类抽象出来可以降低界面和数据库之间的耦合度,高内聚低耦合,一般是**(动词+名词)**比如:销售商品、注册用户.

3. 边界类、

用户对系统的交互类,主要包括:界面类,如对话框,窗口,菜单

二、类图的基本组成

1. 组成

在这里插入图片描述

  1. 类名
  2. 成员变量
  3. 方法
  4. 内部类(一般不使用,)

public class Person {
	private String _name;
	private int _id;
	private int _age = 18;
	public void eat() {
	
	}
	
	public void eat(String food) {
	
	}
	
	public void eat(String food, String drink) {
	
	}
}

2. 成员变量的表示方法

可见性 变量名 : 变量类型 [= 初始值]

- _age : int = 18
  1. 可见性: - private 私有(+public公有)
  2. 变量名: _age
  3. 变量类型: int
  4. 初始值 : 18

3. 方法的表示

eat ( food : String, drink : String)

可见性 方法名 ( 参数1 , 参数2)

  1. 可见性 : + Public
  2. 方法名: havaLunch
  3. 参数:

在这里插入图片描述

三、关联和关系

1.类和类的关联(全局成员变量实线
1. 关联
1. 关联:双向关联(双向无箭头
2. 关联:单向关联
3. 关联:自关联
4. 关联:多重性关联
2. 聚合
3. 组合
2.类和类的关系
1. 依赖调用(参数,局部变量,调用静态方法)
2. 泛化继承
3. 实现接口

1.类和类的关联

  1. 关联
    (1)双向关联(双向无箭头,关联(Association)
    例如 顾客 (Customer) 和 商品(Product),
    在这里插入图片描述
    对应的代码:
public class Customer {
	private Product products;
}
public class Product {
	private Customer customer;
}

(2)单向关联,(单向箭头,单向关联(DirectedAssociation)
例如:顾客(Customer)拥有地址(Address)
在这里插入图片描述

代码:

public class Customer {
	private Address address;
}
public class Address{
}

问题:startUML 生成的代码的奇怪符号

在这里插入图片描述

(3)自关联,就是自己调用自己的的类(全局成员变量)单向关联(DirectedAssociation)
例如:例如:一个节点类(Node)的成员又是节点Node类型的对象,如图
在这里插入图片描述
代码:

public class Node {
	private Node subNode;
}

(4) 多重性关联: 例如一个界面可以有多个按钮,如图(感觉就像单向多了数组??单向关联(DirectAssociation)
在这里插入图片描述
代码:

public class Form {
private Button[] buttons; //定义一个集合对象
……
}
public class Button {
……
}```

(5)聚合关系实现方法可常用为构造注入和设值注入)如图,空心菱形,聚合(Aggregation)
在这里插入图片描述

代码:

public class Car {
	private Engine engine;
	public void Car(Object Engine engine) {
	
	}
	
	public void setEngine(Object Engine engine) {
	
	}
}
public class Engine {
}

问题: 用2一根单向线,一根聚合线才能表示?或者设置聚合线让其表示?


(6)组合(Compositon) 组合是更强力的聚合,因此一般在构造方法就赋值给,全局成员变量,保证整体(比如头部Head)必须包含部分(比如嘴巴Mouth)实心菱形方块
!在这里插入图片描述
代码:

public class Head {
	private Mouth mouth;
	//一般在构造方法就赋值给,全局成员变量
	public Head() {
		mouth = new Mouth(); //实例化成员类
	}
……
}

public class Mouth {
	……
} 

2. 关系(不同于联系,非全局成员变量)

(1)依赖(Dependentcy) ,(虚线单向箭头
依赖表现为形参,局部变量等
如图:
在这里插入图片描述
代码表现:

public class Driver {
	public void drive(Car car) {
		car.move();
	}
    ……
}


public class Car {
	public void move() {
		......
	}
    ……
}  

(2) 泛化(Generalization)继承 ( 实心三角
泛化就是继承,

子类继承父类方法
子类构造函数时候会先调用父类的构造方法,因为子类要用父类的属性(成员变量)和方法需要先夹子父类

例如如图:Student类和Teacher类都是Person类的子类,Student类和Teacher类继承了Person类的属性和方法,Person类的属性包含姓名(name)和年龄(age),每一个Student和Teacher也都具有这两个属性,另外Student类增加了属性学号(studentId),Teacher类增加了属性教师编号(teacherId),Person类的方法包括行走move()和说话say(),Student类和Teacher类继承了这两个方法,而且Student类还新增方法study(),Teacher类还新增方法teach()
在这里插入图片描述
代码:


//父类
public class Person {
protected String name;
protected int age;

public void move() {
        ……
}

    public void say() {
    ……
    }
}

//子类
public class Student extends Person {
private String studentNo;

public void study() {
    ……
    }
}

//子类
public class Teacher extends Person {
private String teacherNo;

public void teach() {
    ……
    }
}

(3)实现接口(Realization):
接口:
1.一般没有属性
2.方法抽象,只有申明,
3.一个类可实现多个接口

例如如图:定义了一个交通工具接口Vehicle,包含一个抽象操作move(),在类Ship和类Car中都实现了该move()操作,不过具体的实现细节将会不一样

在这里插入图片描述
代码:

public interface Vehicle {
public void move();
}

public class Ship implements Vehicle {
public void move() {
    ……
    }
}

public class Car implements Vehicle {
public void move() {
    ……
    }
}

四、案例分析:

案例参考原文

1. 登录模块

(1)要求:基于CS及时聊天系统,用户通过登录界面(LoginForm)输入账号和密码,系统将输入的账号密码和数据库表(User)进行比较,验证用户的账号和密码是否正确,如果正确则进入主界面(MainForm)否则,提示账号或者密码错误。
(2)类图
在这里插入图片描述
(3)说明:
考虑到系统的拓展性,引入接口IUserDAO

考虑到系统扩展性,在本实例中引入了抽象数据访问接口IUserDAO,再将具体数据访问对象注入到业务逻辑对象中,可通过配置文件(如XML文件)等方式来实现,将具体的数据访问类类名存储在配置文件中,如果需要更换新的具体数据访问对象,只需修改配置文件即可,原有程序代码无须做任何修改。

在这里插入图片描述

2. 注册模块

(1)要求:
用户通过注册姐买你(RegisterForm类)输入个人信息,用户点击“注册”按钮将输入的信息通过一个封装的用户对象(UserDTO类)传递给操作数据库的数据库访问类。
(为了提高数据的拓展性,针对不同的数据库需要不同的数据访问类,因此提供数据库访问类接口,如IUserDAO接口,每一个具体的数据访问类,都是某一个数据访问类接口的实现类,比如OracleUserDAO类就是,专门用于Oracle数据库的访问类)

(2)类图
在这里插入图片描述
(3)说明:
在以上功能说明中,可以分析出该系统包括三个类和一个接口,这三个类分别是注册界面类RegisterForm、用户数据传输类UserDTO、Oracle用户数据访问类OracleUserDAO,接口是抽象用户数据访问接口IUserDAO。它们之间的关系如下:
(1) 在RegisterForm中需要使用UserDTO类传输数据且需要使用数据访问类来操作数据库,因此RegisterForm与UserDTO和IUserDAO之间存在关联关系,在RegisterForm中可以直接实例化UserDTO,因此它们之间可以使用组合关联。
(2) 由于数据库类型需要灵活更换,因此在RegisterForm中不能直接实例化IUserDAO的子类,可以针对接口IUserDAO编程,再通过注入的方式传入一个IUserDAO接口的子类对象(在本书后续章节中将学习如何具体实现),因此RegisterForm和IUserDAO之间具有聚合关联关系。
(3) OracleUserDAO是实现了IUserDAO接口的子类,因此它们之间具有类与接口的实现关系。
(4) 在声明IUserDAO接口的增加用户信息方法addUser()时,需要将在界面类中实例化的UserDTO对象作为参数传递进来,然后取出封装在UserDTO对象中的数据插入数据库,因此addUser()方法的函数原型可以定义为:public boolean addUser(UserDTO user),在IUserDAO的方法addUser()中将UserDTO类型的对象作为参数,故IUserDAO与UserDTO存在依赖关系。

原创文章 132 获赞 11 访问量 4701

猜你喜欢

转载自blog.csdn.net/jarvan5/article/details/106068791
今日推荐