资讯专栏INFORMATION COLUMN

设计模式之UML类图

xiao7cn / 1331人阅读

摘要:因为依赖关系不强制,所以用虚线表示关联关系关联关系是类属性依赖,很关键,所以使用实线表示。源码地址类图参考慕课网设计模式精讲大话设计模式设计模式之类图学习二类图

类图(Class diagram)主要用于描述系统的结构化设计。类图也是最常用的UML图,用类图可以显示出类、接口以及它们之间的静态结构和关系。
0x01.类图中的元素 1.类 Class / 接口 Interface

第一格:表示类的名字,抽象类用斜体表示,接口在前面加

第二格:表示类的属性,前面符号表示作用于,冒号后面表示类的类型

符号 解释
+ public
- private
# protected
~ default
下面有横线 表示static静态属性

第三格:表示类的行为,同上

符号 解释
+-#~ 同上
斜体 抽象方法
下面有横线 表示static静态方法
:String :后表示返回值,返回String字符串类型
无: 表示void无返回
2.UML类图中各个类的关系

a).依赖关系

依赖关系的定义为:对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。

可以简单的理解为:类 A 使用到了类 B,而这种使用关系具有偶然性,临时性,非常弱的,但是 B 类中的变化会影响到类 A,比如某个学生要用笔写字,学生与笔的关系就是一种依赖关系,如果笔没水了,那学生就不能写字了(B 类的变化会影响类 A) 或者换另一只笔继续写字(临时性体现)。

使用虚线和箭头,箭头指向被依赖的对象

UML图示

例如上面图中:动物的新陈代谢依赖氧气

/**
 * 动物类
 */
public class Animal {

    /**
     * 生命
     */
    public String life;

    /**
     * 新陈代谢
     * @param oxygen 氧气
     * @param water 水
     */
    public void metabolism(Oxygen oxygen, Water water) {

    }

    public void multiply () {

    }
}
/**
 * 水
 */
public class Water {}

/**
 * 氧气
 */
public class Oxygen {}
b).泛化继承关系

继承表示类与类 (或者接口与接口) 之间的父子关系。在 Java 中,用关键字 extends 表示继承关系。

空心箭头实线,箭头方向是子类指向父类来表示,只有知道对方信息才能指向对方

UML图示

如图所示:鸟类属于动物类(鸟是动物),所以鸟继承自动物。继承了动物的新陈代谢和繁衍,同时也有自己的属性(翅膀)、行为(生蛋)。

public class Animal {
    /**
     * 生命
     */
    public String life;

    /**
     * 新陈代谢
     * @param oxygen 氧气
     * @param water 水
     */
    public void metabolism(Oxygen oxygen, Water water) {

    }

    public void multiply () {

    }
}
/**
 * 鸟
 */
public class Bird extends Animal {
    /**
     * 羽毛
     */
    public String plume;

    /**
     * 两个翅膀
     */
    public List wings;

    /**
     * 生蛋
     */
    public void rawEgg () {

    }
}
c).组合关系

组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”多带带存在时没有任何意义。

使用实心菱形和大于箭头表示,实线说明耦合性更强。组合关系可以在两侧写上数字,表示数量对应关系。组合关系对象拥有同样的生命周期。

UML图示

如图所示:一只鸟有两个翅膀,失去了鸟,翅膀也没有存在的意义,所以鸟和翅膀是共同的生命周期。

/**
 * 鸟
 */
public class Bird extends Animal {

    /**
     * 羽毛
     */
    public String plume;

    /**
     * 两个翅膀
     */
    public List wings;

    /**
     * 生蛋
     */
    public void rawEgg () {

    }
}
/**
 * 翅膀
 */
public class Wing {}
d).关联关系

关联关系的定义为:对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。

它体现的两个类中一种强依赖关系,比如我和我的朋友,这种关系比依赖更强,不存在依赖关系中的偶然性,关系也不是临时的,一般是长期性的。

关联关系分为单向关联和双向关联:

在 Java 中,单向关联表现为:类 A 当中使用了 类 B,其中类 B 是作为类 A 的成员变量。

双向关联表现为: 类 A 当中使用类 B 作为成员变量,同时类 B 中也使用了类 A 作为成员变量。

表示一个类和另外一个类是有关联的,一般有一个属性是另一个类,用实线和大于箭头,指向被关联对象,使用实线说明依赖性比较强。

UML图示

如图所示:企鹅的生存依赖气候的变化。

/**
 * 企鹅
 */
public class Penguin extends Bird {

    //气候
    public Climate climate;

    public Climate getClimate() {
        return climate;
    }

    public void setClimate(Climate climate) {
        this.climate = climate;
    }
}
/**
 * 气候
 */
public class Climate {}
e).聚合关系

聚合关系是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。

整体和局部的关系,两者拥有独立的生命周期,是has-a的关系。

聚合关系中作为成员变量的类一般使用 set 方法赋值。

使用空心菱形和大于箭头表示,菱形指向聚合方,箭头指向个体。空心菱形是可以放东西的盘子,可以用来装东西,东西放在盘子里就可以装进去。

UML类图表示

如图所示:大雁群中有很多只大雁,大眼群有独立的行为(一字飞行,V字飞行)

/**
 * 大雁群
 */
public class BigWildGooseGroup {

    public List bigWildGooses;


    public void oneFly() {
        System.out.println("一字飞行");
    }

    public void vfly() {
        System.out.println("V字飞行");
    }

    public List getBigWildGooses() {
        return bigWildGooses;
    }

    public void setBigWildGooses(List bigWildGooses) {
        this.bigWildGooses = bigWildGooses;
    }
}
/**
 * 大雁
 */
public class BigWildGoose extends Bird implements IFly{
    @Override
    public void fly() {}
}
f).实现关系

表示一个类实现一个或多个接口的方法。接口定义好操作的集合,由实现类去完成接口的具体操作, 在 Java 中使用 implements 表示。在 Java 中,如果实现了某个接口,那么就必须实现接口中所有的方法。

使用空心三角和虚线表示,箭头指向接口。实线关系对类的耦合比较弱,所以使用虚线表示。

一般使用接口定义抽象行为。比如鸟具有飞行的行为!

UML表示

如图所示:大雁实现了飞行接口,拥有了飞行行为。

/**
 * 大雁
 */
public class BigWildGoose extends Bird implements IFly{
    @Override
    public void fly() {}
}
/**
 * 飞行接口
 */
public interface IFly {
    void fly();
}

接口的其他表示方法:棒棒糖表示法

0x02.相似关系比较 1.依赖关系和关联关系

依赖关系:一般使应用实现在方法上,如果不调用方法使不需要使用的。因为依赖关系不强制,所以用虚线表示!

关联关系:关联关系是类属性依赖,很关键,所以使用实线表示。

2.聚合关系和组合关系,空心和实心菱形

数量少方向的是菱形箭头。

聚合是一个盘子可以称很多东西,但是他们是相同的,只是数量不同,不同的生命周期。是一组事物形成了一个新的整体,具有独立的生命周期与行为。

组合的生命周期是相同的。

3.继承和实现

继承:是类和类之间的关系,所以用实线。

实现:限制的不明显,只限制了行为,所以用虚线。

只有知道对方信息,才可以被指向,所以箭头的方向都是指向父类或接口。

0x04.源码地址

uml类图: https://github.com/sigmako/design-pattern/tree/master/uml

0x05.参考

慕课网设计模式精讲: https://coding.imooc.com/class/270.html

大话设计模式: https://book.douban.com/subject/2334288/

设计模式之 UML 类图: https://zhuanlan.zhihu.com/p/24576502

UML学习(二)-----类图: https://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74644.html

相关文章

  • 从零开始单排学设计模式UML类图」定级赛

    摘要:从零开始单排学设计模式的国服排位之旅,今天正式开启目前段位定级赛这篇文章来总结下类图,本来不打算讲类图的,因为我在学习设计模式的时候,一遇到有关的就会自动忽略,一看感觉就很复杂。关联关系用实现箭头来表示。 阅读本文大概需要 3.5 分钟。 本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统。 所以现在打算重写,加上距离现...

    Loong_T 评论0 收藏0
  • UML 及 StarUml

    摘要:类之间的关系关联关系关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一个类对象与另一个类对象之间有联系。自关联在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。 UML UML:统一建模语言(Unified Modeling Language)。在 UML 系统开发中有三个主要的模型: 功能模型:从用户的角度展示系统的功能,包括用例图...

    NikoManiac 评论0 收藏0
  • Python自动绘制UML图、函数调用图(Call Graph)

    摘要:借助,自动提取代码的动态调用流程图。绘制类图安装是一个开源图形可视化软件。循环曲线表示递归过程调用。绘制的常用工具有静态调用图等。包括模块之间的调用流程函数调用次数及耗时等。 ...

    widuu 评论0 收藏0
  • JS设计模式学习_基础篇

    摘要:工厂模式单例模式结构型设计模式关注于如何将类或对象组合成更大更复杂的结构,以简化设计。 一、写在前面 设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 当然我们可以用一个通俗的说法:设计模式是解决某个特定场景下对某种问题的解决方案。因此,当我们遇到合适的场景时,我们可能会条件反射一样自然而然想到符合这种场景的设计模式。 比如,当系统中某个接口的结构已经无法满足...

    venmos 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<