UML类图是学习设计模式之前必会必学的知识点,学习设计模式会涉及到大量的类结构,写这篇文章的同时也是在记录自己在学习设计模式的过程中遇到的一些问题,大家来一起参考一下吧。
首先看一下类图概念,简单来说就是更加直观的看一个类的结构,按照国际惯例类图就是采用UML的方式表示。
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模,也用于详细建模,将模型转换成编程代码。
下面引用一个常用UML类图图示样例:
基本概念:
矩形框代表一个类的结构(Class),类图分为三层:
第一层代表类名,若是抽象类类名用斜体表示。
第二层代表特性,也就是字段或者属性。
第三层代表操作,也就是方法或行为。
其中,符号表示访问权限:‘+’表示public,‘-’表示private,‘#’表示protected。类与类之间的符号代表两个类的关系。
类之间的关系:
类与类一共有如下几种关系:继承(Generalization)、实现(Realization)、依赖(Dependence)、关联(Association)、聚合(Aggregation)、组合(Composition)。
1、继承关系
继承关系中,子类继承父类的所有特征和行为。看到类图中的动物类和鸟类,鸟类是一种动物,两者是继承的关系。UML类图表示如下:
继承关系用三角形+实线表示,方向从子类指向父类。
在Java语言中,extends关键字代表继承,简单得按照这个类图写一下代码吧:
public class Animal {
public int lives;
public void breeding(){
if (lives > 0){
System.out.println("我要繁殖啦~");
}
}
}
public class Bird extends Animal {
public String feather;
public void layEggs(){
System.out.println("下蛋方法");
}
}
2、实现关系
实现是类与接口的一种关系,类实现接口的所有特征与行为。看到大雁类和飞翔接口的位置,接口有interface标识,它们之间的是实现关系,类必须实现接口中的所有方法。因此大雁类具有"飞()"方法。类图如下:
实现关系用三角形+虚线表示,方向从类指向接口。
implements关键字代表实现,简简单单过一下代码:
public interface Fly {
public void flyaway(); //飞翔接口
}
public class WildGoose extends Bird implements Fly{
@Override
public void flyaway() {
System.out.println("大雁飞翔了");
}
@Override
public void layEggs() {
super.layEggs();
System.out.println("大雁下蛋了");
}
}
3、依赖关系
依赖关系是一种弱的使用的关系, 即一个类的实现需要另一个类的协助。在类图中,动物依赖于水和空气才能生存,这是依赖关系的一个例子,类图表示如下:
依赖关系用箭头+虚线表示,方向从依赖类指向被依赖类。
代码体现在局部变量、方法的参数或者对静态方法的调用中。补充一下刚才动物类的方法:
public class Oxygen {
@Override
public String toString() {
return "氧气浓度:21%";
}
}
public class Water {
@Override
public String toString() {
return "100ml的水";
}
}
public class Animal {
public int lives;
public void breeding() {
if (lives > 0) {
System.out.println("我要繁殖啦~");
}
}
//新方法,新陈代谢
public void metabolism(Oxygen o, Water w) {
System.out.println("新陈代谢需要" + o.toString() + "和" + w.toString());
}
}
4、关联关系
关联关系比较常见,是一种强的、稳定的、持久的关系, 它使一个类知道另一个类的属性和方法。例子中表示为企鹅‘知道’气候的变化。
关联关系用箭头+实线表示。方向从关联类指向被关联类。
代码体现在成员变量中,继续写一下代码吧:
public class Climate {
}
public class Penguin extends Bird{
private Climate climate;
}
5、聚合关系
聚合关系表示部分与整体的一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。根据图例就可以理解为雁群包含了每一只大雁,但大雁离开雁群还是可以独立存在的,所以大雁不是雁群的一部分。
聚合关系用空心菱形+实线箭头表示,菱形顶端为整体。
代码体现在成员变量中,继续撸一下代码,简单写了下逻辑:
public class WideGooseAggregate {
private WildGoose[] arrayWideGoose = new WildGoose[3];
public WideGooseAggregate(){
arrayWideGoose[0] = new WildGoose();
arrayWideGoose[1] = new WildGoose();
arrayWideGoose[2] = new WildGoose();
}
public void vFly() {
System.out.println("V型飞行");
for (WildGoose wGoose : arrayWideGoose) {
wGoose.flyaway();
}
}
public void hFly() {
System.out.println("一型飞行");
for (WildGoose wGoose : arrayWideGoose) {
wGoose.flyaway();
}
}
}
6、组合关系
组合关系表示部分与整体的一种强的拥有关系,体现为严格的部分和整体关系,部分和整体的生命周期一样。根据例子,翅膀与鸟就是组合的关系。翅膀是鸟的一部分,翅膀脱离了鸟就不能独立存在。
组合关系用实心菱形+实线箭头表示,菱形顶端为整体。
代码体现在成员变量中,再改一下刚才鸟类的代码吧:
public class Bird extends Animal {
public String feather;
private Wings wings; //翅膀
public Bird(){
//翅膀与鸟的生命周期一样
wings = new Wings();
}
public void layEggs(){
System.out.println("下蛋方法");
}
}
总结
在理解性记忆的同时,允许我再啰嗦一下:
继承:三角形+实线
实现:三角形+虚线
依赖:箭头+虚线
关联:箭头+实线
聚合:空心菱形+实线箭头
组合:实心菱形+实线箭头
此文章主要从记住类图长什么样子和代码应该怎么写的角度去写,欢迎大家讨论。
推荐阅读
基础篇:
设计模式前篇之——UML类图必会知识点
设计模式前篇之——一起过一下面向对象的概念
创建型模式:
简易理解设计模式之:简单工厂模式——来试试接入支付功能
简易理解设计模式之:工厂方法模式——数据存储例子
简易理解设计模式之:抽象工厂模式——更换数据库例子
简易理解设计模式之:建造者模式——学习使用“链式调用”
简易理解设计模式之:原型模式——深、浅拷贝的概念
简易理解设计模式之:单例模式——单例模式的几种常用写法
结构型模式:
简易理解设计模式之:适配器模式——Android列表视图控件设计方式
简易理解设计模式之:桥接模式——穿衣服经典案例2
简易理解设计模式之:组合模式——实现View中的树状结构
简易理解设计模式之:装饰模式——穿衣服经典案例
简易理解设计模式之:外观模式——第三方SDK的帮助类
简易理解设计模式之:享元模式——五子棋游戏例子
简易理解设计模式之:代理模式——iOS视图控件设计方式
行为型模式:
简易理解设计模式之:策略模式——优化一下支付功能
简易理解设计模式之:模板方法模式——Android中的BaseActivity基类
简易理解设计模式之:观察者模式——监听与回调
简易理解设计模式之:状态模式——优化登录操作
简易理解设计模式之:备忘录模式——Word文档的工作原理
简易理解设计模式之:迭代器模式——遍历对象的好帮手
简易理解设计模式之:命令模式——实现命令的参数化配置
简易理解设计模式之:责任链模式——OA中请假流程示例
简易理解设计模式之:中介者模式——多人聊天室例子
简易理解设计模式之:解释器模式——语言和文法
简易理解设计模式之:访问者模式——员工考核例子