本人只是一只普普通通的大三的测试小白,该文章是根据平时上课老师讲的内容所写的
类之间的关系
主要内容:
- 关联关系(Association)
- 依赖关系(Dependency)
- 泛化关系(Generalization)
- 聚合关系(Aggregation)
- 组合关系(Composition)
- 实现关系(Realization)
1.关联关系
关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。
public class LoginForm {
private JButton loginButton;//定义为成员变量
...
}
public class JButton {
...
}
1.1双向关联
在默认情况下关联是双向的。例如顾客(Customer)购买商品(Product)并拥有商品,反之,卖出的商品总有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系。
public class Customer {
private Product[] products;
...
}
public class Product {
private Customer customer;
...
}
1.2单向关联
类的关联关系也可以是单向的,单向关联用带箭头的实线表示。例如顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系。
public class Customer {
private Address address;
...
}
public class Address {
...
}
1.3自关联
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。例如一个结点类(Node)的成员又是节点Node类型的对象。
public class Node {
private Node subNode;
...
}
1.4多重性关联
多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
public class Form {
private Button[] buttons;//定义一个集合对象
...
}
public class Button {
...
}
2.依赖关系
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。在大多数情况下,依赖关系体现在某个类的方法使用另一个类 的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。例如驾驶员开车,在Driver类的drive()方法中将Car类型的对象car作为一个参数传递,以便在drive()方法中能够调用car的move()方法,驾驶员的drive()方法依赖车的move()方法,因此类Driver依赖类Car。
public class Driver {
public void drive(Car car) {
car.move();
}
...
}
public class Car {
public void move() {
...
}
...
}
3.泛化关系
泛化关系也就是继承关系,用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。在UML中,泛化关系用带空心三角形的直线来表示。在代码实现时,使用面向对象的继承机制来实现泛化关系,在Java语言中使用extends关键字来实现。
//父类
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() {
...
}
}
4.聚合关系
聚合关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。例如汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此汽车和汽车发动机是聚合关系。
public class Car {
private Engine engine;
//构造注入
public Car(Engine engine) {
this.engine = engine;
}
...
}
public class Engine {
...
}
5.组合关系
组合关系也表示类之间整体与部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。在UML中,组合关系用带实心菱形的直线表示。例如人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系。
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth();//实例化成员类
}
...
}
public class Mouth {
...
}
6.实现关系
接口之间也可以有与类之间关系类似的继承关系与依赖关系,但是接口和类之间还存在一种实现关系,在这种关系中类实现了接口,类中的操作实现了接口中所声明的操作。在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。例如定义一个交通工具接口Vehicle,包含一个抽象操作move(),在类Ship和类Car中实现了该move()操作,不过具体的实现细节将会不一样。在代码实现时,不同的面向对象语言也提供了不同的语法,在Java语言中使用implements关键字来实现。
public interface Vehicle {
public void move();
}
public class Ship implements Vehicle {
public void move() {
...
}
}
public class Car implements Vehicle {
public void move() {
...
}
}
综合例子:
书名:Java设计模式 编著:刘伟 出版社:清华大学出版社