(二)设计模式之UML六大关系

来源:互联网 发布:碧海潮生曲 知乎 编辑:程序博客网 时间:2024/06/05 08:29

在学习六大关系之前我们先看一下UML。UML(Unified Modeling Language),统一建模语言,是一种标准的图形化建模语言,它不是一种可视化编程语言。这个时候你可能会问:我们编程就是敲代码啊,要这些干嘛?我们读高中的时候,上数学物理课,老师都会说,边读题目的时候一定画一个草图,这样能帮助你快速的理解题意。而老师在讲题目的时候也会画出一个例图方便大家理解。UML也一样,不仅方便你自己理解这个过程,还能让别人很清楚的了解你写的什么。让别人看懂你的代码这也是非常重要的。

所以说利用UML有下面几点好处:

1、使用模型可以更好地理解问题。
2、使用模型可以加强人员之间的沟通。
3、使用模型可以更早地发现错误或疏漏的地方。
4、使用模型可以获取设计结果。
5、模型为最后的代码生成提供依据。

UML六大关系:
关联、聚合、组合、依赖、泛化,实现

(1)
关联关系(Association)
关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有(hasa)联系。这种关系通常情况下是一个类的对象作为另一个类的属性。
Person类:
Class Person{private String name;private Car car;....}
Car类:
class Car{private String brand;}
在Person类中有一个属性,这个属性是Car的对象。那么这个时候Person和Car就是关联关系。
UML类图:

我们举的例例子是一个单向关联的例子,另外还有几种关联,比如多重关联,自关联,双向关联。
自关联,就是再一个类中有自身类的对象作为属性。比如XMl文件里面的结点,一个父结点下有很多,子结点。同样是结点,抽象成类的话。就是对自身的关联了。
多重关联,比如说一个公司有很多员工。在公司这个类中有一个属性,是员工对象的集合,那么这个时候公司类和员工类就是一个多重关联了。
双向关联,比如人和车,Person类中有Car的对象,那么在Car中也可以有Person类的对象作为主人。这就是双向关联了。
其实关联关系是一个很宽泛的概念,聚合和组合也是一种关联,只是特殊情况罢了,什么时候用关联这个词,什么时候用聚合组合也没有明确的界限。

(2)聚合关系(Aggregation)

聚合关系表示一个整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构,从而找出一些成员类,该整体类和成员类之间就形成了聚合关系。

Company类和Employee类:

class Company{private Employee[] Employees;public void work(){System.out.println("员工开始工作");}}class Employee{private String name;}
这个例子就跟多重关联差不多。聚合关系是一种强的关联关系。在这里需要注意的是聚合关系的整体和部分是可以分开独立的,也就是说,他们没有共同的生命周期,有没有共同的生命周期体现在构造方法里面,显然这里没有。
UML类图:


(3)组合关系(Composition)
组合关系也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。理解了组合跟聚合最关键的区别那么组合基本上就没有什么不理解的地方了。
Person类和Brain类:
public class Person{private Brain brain;public Person(){brain = new Brain();}}public class Brain{private String name;}
人和大脑是不可分的,少了谁都不行。他们具有共同的生命周期,那么他们就是组合关系,再次强调,组合关系一定是具有共同生命周期的,就好像你死了,我也不活了。一定要特别注意。具体体现在构造方法里面。
UML类图:


(4)依赖关系(Dependency)
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。比如你在银行办业务会使用笔来填表格,笔本身并不一定是属于你这个对象的,你只是去使用它。你在你的write方法里面去调用了笔的对象。
Person类和Pen类:
public class Person{    //填表格     public void write(Pen pen){    pen.run();    }}public class Pen{public void run(){System.out.println("write");}}
依赖关系的体现方式有三种:
1、方法中调用到其他对象
2、作为方法的参数
3、作为方法的返回值
这三种情况都属于依赖关系
UML类图


(5)泛化关系(Generalization)

泛化关系也就是继承关系,也称为“is-a”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。在Java中用的extends关键字,这个都比较熟悉了就不多说了。
UML类图

(6)
实现关系(Realization)
实现关系也很简单就是实现接口,跟泛化差不多,只不过箭头的虚线。在这里就不赘述了。

到这里六大关系就说完了,不对的地方还望帮我指正。



0 0
原创粉丝点击