设计模式之UML类图六大关系辨析【2】
六大关系:继承(extends)、实现(Realization)、依赖(use-a)、关联(association)、聚合(has-a)、组合(强聚合)(Composition)。
类与类之间的强弱关系:NULL<依赖<关联<聚合<组合
有事没事,懂与不懂,先见此图。

一、继承/泛化(Extends;is-a)
指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系。
abstract class Animal{
//property
public boolean 有生命力;
//action/method
public void 新陈代谢(O2 氧气,Water 水);
public void 繁殖();
}
abstract class Bird extends Animal{
//property
public Object 羽毛;
public Object 眼睛;
public Object 脚;
public java.util.Collection<翅膀> 翅膀;
//action/method
public 鸟蛋 下蛋(){...}
}
二、实现(Realization)
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;
interface 说话{
public void 说话();
}
public class 唐老鸭 extends 鸭 implements 说话 {
//property
public void 讲人话() {
// TODO: implement
}
}
三、依赖(Dependency;use-a)
一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会可能会影响到A;

class 氧气 {...}
class 水{...}
abstract class Animal{
//property
public boolean 有生命力;
//action/method
public void 新陈代谢(O2 氧气,Water 水);
public void 繁殖();
}
四、关联(Association)【较为混淆和难以理解的】
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

class 气候{
}
class 企鹅 extends Bird {
//property
public 气候 气候;
//action/method
public 企鹅蛋 下蛋(){...}
}
补充:
关联描述两个类之间行为的一般二元关系。例如,一个学生选修一门特定的课程是学生类Student和课程类Course之间的一个关联,而一个教师教授一门课程是师资类Faculty和课程类Course之间的一个关联。Java代码中,关联可以用属性和方法来实现。
public class Student {
private Course[] courses;
public void addCourse(Course s) {
. . . . . .
}
}
public class Course {
private Strudent[] students;
private Faculty faculty;
public void addStudent(Student s) {
. . . . . .
}
public void setFaculty(Faculty faculty) {
this.faculty = faculty;
}
}
public class Faculty {
private Course[] courses;
public void addCourse(Course s) {
. . . . . .
}
}
五、聚合(has-a)
聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

class 大雁 extends Bird implements 飞翔{
//action/method
public 雁蛋 下蛋(){...}
public void 飞(){...}
}
class 雁群 {
//property
public 大雁 obj_大雁;
//action/method
public void V形飞行();
public void 人形飞行();
}
补充:一家公司拥有多名员工
public class Company {
private List<Employee> employees;
}
public class Employee {
private String name;
}
六、组合(强聚合)(contains-a)
组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

abstract class Bird extends Animal{
//property
public Object 羽毛;
public Object 眼睛;
public Object 脚;
public java.util.Collection<翅膀> 翅膀;
//action/method
public 鸟蛋 下蛋(){...}
}
补充:
聚合是一种较弱形式的对象包含(一个对象包含另一个对象)关系。较强形式是组合(Composition). 在组合关系中包含对象负责被包含对象的创建以及生命周期,即当包含对象被销毁时被包含对象也会不复存在。例如一辆汽车拥有一个引擎是汽车类Car与引擎类Engine的组合关系。下面是组合的一些例子。
(1)通过成员变量初始化
public class Car {
private final Engine engine = new Engine();
} class Engine {
private String type;
} (2)通过构造函数初始化
public class Car {
private final Engine engine; public Car(){
engine = new Engine();
}
} public class Engine {
private String type;
} (3)通过延迟初始化
public class Car {
private final Engine engine;
public Engine getEngine() {
if (null == engine) {
engine = new Engine();
}
return engine;
}
} public class Engine {
private String type;
}
=====================================================
补充:

参考文献
[1] 《UML类图中的六大关系:关联、聚合、组合、依赖、继承、实现》
设计模式之UML类图六大关系辨析【2】的更多相关文章
- 设计模式之UML类图的常见关系
设计模式之UML类图的常见关系 本文来自转载 烧点饭博客 本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association), ...
- 北风设计模式课程---UML类图各符号含义
北风设计模式课程---UML类图各符号含义 一.总结 一句话总结: 用脑子,挺好记的:实线关系肯定比虚线重,箭头.三角形.菱形的关系肯定依次加重,三角形是继承和实现, 1.UML类图中 线+箭头 表示 ...
- 23种常用设计模式的UML类图
23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...
- 图解Java设计模式之UML类图
图解Java设计模式之UML类图 3.1 UML基本介绍 UML图 UML类图 3.1 UML基本介绍 1)UML – Unified modeling language UML(统一建模语言),是一 ...
- 转载:23种常用设计模式的UML类图
转载至:https://www.cnblogs.com/zytrue/p/8484806.html 23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源 ...
- 【设计模式】UML类图及Java的类之间的关系
UML类图展示 设计模式中的对象关系 关联和依赖的对比 依赖关系 虚线箭头 依赖是a类成员方法中有b类的属性,动物新陈代谢方法中有水和空气的属性,只有调这个方法的时候,才可能临时用一下 关联关系 实线 ...
- 设计模式之UML类图的常见关系(一)
本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association),聚合(Aggregation),组合(Compositio ...
- 设计模式之UML类图
在学设计模式的过程中经常碰到各式各样的UML类图.那些眼花缭乱的符号有什么含义呢? 类图含义 类图中的关系 从网上找来一张图作为实例 依赖关系:比如动物依赖氧气和水,这里如学生要依赖自行车.用虚线箭头 ...
- 从零开始单排学设计模式「UML类图」定级赛
阅读本文大概需要 3.5 分钟. 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了, ...
随机推荐
- python之json数据存储
# 数据存储:json.dump()和json.load() # date:2017-07-17 import json file_name = 'D:/json_file.txt' nums = [ ...
- js 实现List
js 实现List 列表是一组有序的数据.每个列表中的数据项称为元素.在 JavaScript 中,列表中的元素可以是任意数据类型. 我们可以根据数组的特性来实现List. List 抽象数据类型定义 ...
- maven 聚合的含义是父类打包 ,清理等 则子类自动打包;也就是一键打包 方便服务
maven 聚合的含义是父类打包 ,清理等 则子类自动打包:也就是一键打包 方便服务
- BZOJ2124 等差子序列(树状数组+哈希)
容易想到一种暴力的做法:枚举中间的位置,设该位置权值为x,如果其两边存在权值关于x对称即合法. 问题是如何快速寻找这个东西是否存在.考虑仅将该位置左边出现的权值标1.那么若在值域上若关于x对称的两权值 ...
- 架构师成长之路7.1 CDN理论
点击返回架构师成长之路 架构师成长之路7.1 CDN理论 CDN,Content Distribute Network,内容分发网络:CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数 ...
- 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试
前言 JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量. JUnit 测试框架具有以下重要特性: 测试工具 测试套件 测试运行器 测试分类 了 ...
- /dev/null与/dev/zero区别
/dev/null和/dev/zero的区别 /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着! /dev/zero,是一个输入设备,你可你用它来初始化文件.该设备无穷尽 ...
- Java -- JDBC 学习--PreparedStatement
可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象.PreparedStatement 接口是 Statement ...
- Java -- JDBC 学习--通过 ResultSet 执行查询操作
ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果. 1. 调用 Statement 对象的 executeQuery(sql) 可以得到结果集. 2. ResultSet 返回的实 ...
- 【洛谷P1854】花店橱窗 线性dp+路径输出
题目大意:给定 N 个数字,编号分别从 1 - N,M 个位置,N 个数字按照相对大小顺序放在 M 个位置里,每个数放在每个位置上有一个对答案的贡献值,求一种摆放方式使得贡献值最大. 题解:一道典型的 ...