关联
表现为在一个类中创建另一个类的对象(private Employee director;)
成分
1. 关联方向(可选):用黑三角标注
2. 关联名(可选)
3. 重数(可选,未注明默认为1):※或数字等标示
4. 关联角色:类名
5. 限定词(可选):属性名
在关联关系末端设置小方框调价限定词可以将普通关联变为限定关联,
从而将一对多或多对多的关系简化为一对一或多对一。
限定词一般选取的是能够唯一确定一个实例对象的属性,
或者说是主键。在类图中放置的位置一般是负责调用的类的一侧,
比如在一个目录下有多个文件,我们设置两个类:目录类和文件类,
文件名能唯一确定一个文件,可以视为主键,那么如果要表述目录类和
文件类的关系并附加限定词的话,就应该是在目录类一侧添加限定框
内容为文件名。(图略)
6. 关联类(可选):记录关联的性质
符号
1.连接两个类之间的直线
2.箭头(可选):普通的关联是没有箭头的,描述的是双向的数据获取,
加上箭头之后指明了信息获取方向表示只能从箭头发出一侧的类获取箭头
指向一侧的类的信息。(其他的类关系如果加上箭头也是一样的意思)
3.黑三角:指示关联名字的方向
4.※(星号):用于表述关联重数
5.限定框(可选)
6.虚线:关联类与关联之间的联系
分类
1.普通关联
2.限定关联:添加了限定词的关联
3.定向关联(个人定义) :添加了箭头限制只能从一侧获取另一侧的信息。
代码实例:
package relation.Association;
public class ProjectTask {
private Employee director;
public Employee getDirector() {
return director;
}
public void setDirector(Employee director) {
this.director = director;
}
}
package relation.Association;
public class Employee {
public int empno;
private String firstname = "";
private String lastname = "";
private static int empcount;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public static int getEmpcount() {
return empcount;
}
public static void setEmpcount(int empcount) {
Employee.empcount = empcount;
}
public Employee(String firstname, String lastname) {
super();
this.firstname = firstname;
this.lastname = lastname;
this.empno = Employee.empcount++;
}
@Override
public String toString() {
return "Employee [empno=" + empno + ", firstname=" + firstname + ", lastname=" + lastname + "]";
}
}
聚集
表现为在一个类中创建另一个类的对象(private Employee director = null;)
成分
1.整体类
2.成员类
3.聚集关系
4.关系名
5.重数(可选,默认为1)
符号
1.带末端菱形的实线——菱形靠近整体类一侧
1.1 空心菱形:表示共享聚集
1.2 实心菱形:表示组合聚集
2.箭头(可选)
分类
1.共享聚集(弱聚集关系)(又称聚合关系):一荣俱荣 —— 一个部分构成多个整体,
类似于工具类与调用类的关系。
2.组合聚集(强聚集关系)(又称组合关系):一损俱损——一个部分对应唯一整体,
类似于公司类与部门类的关系。
代码实例
聚合关系:
package relation.Aggregation;
public class ProjectTask {
private Employee director = null;
public Employee getDirector() {
return director;
}
public void setDirector(Employee director) {
this.director = director;
}
}
以上ProjectTask类的实现跟关联关系部分的实现基本一样,但是上述代码确实能体现聚合关系的语义描述。
那么关联和聚合的区别是什么呢?(留待思考)
组合关系:
package relation.Composition;
public class ProjectTask {
Employee director = null;
public Employee getDirector() {
return director.clone();
}
public void setDirector(Employee director) {
this.director = director.clone();
}
}
小结:上述代码中的clone方法表示凡是ProjectTask类的对象,它内部的director均是由原始对象创建的副本。(并且是深层复制——需要重写方法体)
PS:上述代码不完整,后续需要进行完善。
PSS:虽然聚集和关联的表现形式非常接近,但是他们在实际应用中的语义有比较明显的区别,因此逆向工程中可以在一定程度上通过语义对两种关系进行区分。
泛化
表现为类之间的继承关系(extends),有些地方说也可以描述接口间的关系,目前这一点还不太确定。
成分
1.父类(抽象类)
2.子类
3.附加约束条件(多重、不相交、完全、不完全)
符号
1.末端带空心三角形的连线——空心三角靠近父类一侧
分类
1.普通泛化
2.受限泛化(添加附加约束条件)
代码实例
package relation.Generalization;
public class Manager extends Employee{
public Manager(String firstname, String lastname) {
super(firstname, lastname);
// TODO 自动生成的构造函数存根
}
public static void main(String[] args) {
Employee manager = new Manager("L", "L");
System.out.println(manager);
}
}
package relation.Generalization;
public class Clerk extends Employee {
public Clerk(String firstname, String lastname) {
super(firstname, lastname);
// TODO 自动生成的构造函数存根
}
}
依赖
表现为某个类中的方法入参是另一个类的对象,或某个类的方法体中用到另一个类的对象进行数据操作。作为另一个类的方法参数。
成分
1.两独立对象
2.关系描述
符号
1.带箭头的虚线——箭头指向被使用的一次
2.书名号《》——用于关系描述
分类
依赖关系
代码实例
package relation.Dependency;
public class Project {
// private ProjectTask task = null;
public void addTask(ProjectTask pTask) {
System.out.println(pTask.getName());
}
}
package relation.Dependency;
public class ProjectTask {
String name;
public ProjectTask(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package relation.Dependency;
public class ProjectMan {
private Project selectProject = new Project();
public void addproject(String name) {
ProjectTask pTask = new ProjectTask(name);
selectProject.addTask(pTask);
}
public static void main(String[] args) {
ProjectMan projectMan = new ProjectMan();
projectMan.addproject("老王");
}
}
细化
主要表现为类对接口的实现(implements)。
成分
1.接口
2.实现类
符号
1.末端带空心三角的虚线——三角靠近接口一侧
代码实例
package relation.Detailing;
public interface Work {
public void work();
}
package relation.Detailing;
public class Program implements Work{
@Override
public void work() {
// TODO 自动生成的方法存根
System.out.println("程序开发");
}
}