设计模式——类图以及类与类之间的关系
设计模式在程序设计上有着很重要的作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。
一、用UML表示一个类
类图一般是三行的结构:
- 类名称
- 属性:格式(可见性 名称:类型[=缺省值])
- 方法:格式(可见性 名称(参数列表)[返回类型])
注:在Visio中的画的类图中使用的是C#的数据类型,与Java的略有差别。
二、类与类之间的关系
类与类之间主要有6种关系,包括依赖,关联,聚合,组合,继承,实现。他们的耦合度是一次增强的。
1、依赖(Dependency)
依赖主要体现了一种使用关系,两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,主要体现为依赖关系。
依赖关系主要有3种表现形式:(以类A中使用了类B为例)
- 类B是作为类A的方法参数
- 类B是类A的方法中的局部变量
- 在类A中调用类B的静态方法
在依赖中使用的是“虚线+箭头”。
public class Student {
public void read(Book book){
System.out.println("读的书是:" + book.getName());
}
public void eat(Food food){
System.out.println("吃的是:" + food.getName());
}
}
2、关联(Association)
关联主要体现的是一种对应关系,两个相对独立的对象,当一个对象的实例与另一个对象的实例存在固定的对应关系时,这两个对象之间为关联关系。通常是将一个类的对象作为另一个类的成员变量。
关联关系的分类:
- 单向关联
- 双向关联
(单向关联)
(双向关联)
public class Student{
private String id;
private ClassName className;
public Student(String id){
this.id = id;
this.className = new ClassName();
}
}
3、聚合(Aggregation)
聚合是关联关系的一种,表现了一种弱的“拥有”关系,关联关系的对象之间是相互独立的,但是聚合关系的对象之间存在着一种包容关系,体现的是A对象可以包容B对象,但是B对象不是A对象的一部分。他们之间是“整体-个体”的关系。
成员对象通常作为构造方法、Setter方法或业务方法的参数注入到整体对象中。
public class People{
private Student student;
private Worker worker;
private Farmer farmer;
public People(Student student, Worker worker, Farmer farmer){
this.student = student;
this.worker = worker;
this.farmer = farmer;
}
}
4、组合(Composition)
组合是一种强的“拥有”关系,组合中的类之间是“整体-部分”的关系,“整体”负责“部分”的生命周期,“部分”和“整体”的生命周期是一样的,“部分”单独存在是没有任何意义的。通常在整体类的构造方法中直接实例化成员类。
public class Bird{
private Wing wing;
public People(){
wing = new Wing();
}
5、继承(Generalization)
继承表示的是类与类之间或者接口与接口之间的父子关系,在java中使用的是extends关键字。
public class Bird extends Animal{
}
6、实现(Implementation)
实现表示的是一个类实现一个或者多个接口,在java中使用的是implements关键字。
public class Bird implements Animal{
}
参考文献
- 深入浅出UML类图(http://www.uml.org.cn/oobject/201211231.asp)
- 设计模式中类的关系(http://blog.csdn.net/zhengzhb/article/details/7187278)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JDK1.8的几个简单Lambda表达式
- 腾讯云直播开发日记 (一) 直播播放和观看
- Docker六脉神剑(二) 使用Docker构建lnmp开发环境
- redis主从配置+集群搭建
- 【Ceph RGW】找一个用Go写的s3cmd
- 技术分享 | 如何优雅地在 Windows 上从 MySQL 5.6 升级到 5.7
- SpringCloud分布式配置中心
- Sharding-Proxy的基本功能使用
- React-Redux 对Todolist修改
- 快排解决寻找数组中的第K个最大元素
- Docker六脉神剑(一) Mac极速体验
- React-Router 5.0 制作导航栏+页面参数传递
- Vue3.0快速入门(速查)
- 憧憬博客Nginx到Tengine的迁移
- SpringCloud微服务构建浅析