plantuml 依赖_遇见PlantUML

plantuml 依赖_遇见PlantUML前言来到公司实习也快一个月了,最大的体会就是,虽然大部分时间做的是简单的增删该查,但不同于在学校时写的Demo,你要充分考虑程序的鲁棒性(健壮性)、可扩展性(可维护性)、时间/空间复杂度等。因为是要实际上线的项目,你需要面面俱到,对团队负责。于是决定在完成组里任务之余,花时间提高自己的的编码规范、多思考程序设计的可扩展性、性能是否可观等。我觉得开发工程师和码农之间的区别是,不仅是复制粘贴和以实现功…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

plantuml 依赖_遇见PlantUML

前言

来到公司实习也快一个月了,最大的体会就是,虽然大部分时间做的是简单的增删该查,但不同于在学校时写的Demo,你要充分考虑程序的鲁棒性(健壮性)、可扩展性(可维护性)、时间/空间复杂度等。因为是要实际上线的项目,你需要面面俱到,对团队负责。

于是决定在完成组里任务之余,花时间提高自己的的编码规范、多思考程序设计的可扩展性、性能是否可观等。我觉得开发工程师和码农之间的区别是,不仅是复制粘贴和以实现功能为最终目标,还要考虑如何更优雅的编码、如何实现代码复用而避免重复动作,这是一种追求,也能给工作带来一种工艺、匠心上的体验。

于是我想从设计模式下手,学习前辈们多年沉淀下来的优雅的编码技巧。之前曾看过《Head First设计模式》,当时感觉写的挺好,但是急于求成,一味地莽着看完了,到现在回想起来却也不记得几分。我觉得实战和重复是学习的重要因素,纸上得来终觉浅,绝知此事要躬行,还是要花时间认真学一遍啊~

感觉《Head First设计模式》中的内容针对GUI编程的较多,而现在Java主流应用在服务端,再加上看过的书除非是像《深入理解Java虚拟机》这种每每“”温故而知新”的,我不太愿意看第二遍,于是将目标定在了《图解Java设计模式》上。(本来上当当搜“Java设计模式”发现《Java设计模式及实践》好像还不错而且是针对Java服务端的,但奈何太新网盘上还搜不到PDF资源,而我又经济拮据……)

在看设计模式相关的书籍时总有一个感觉,当设计模式中的角色较多时很容易把自己搞混,这时一个清晰的Java类图能够高效的帮你理清思路以及如此设计的用意。于是我又折腾的下载了一个IDEA插件PlantUML,自此PlantUML的入坑之路拉开序幕……

安装及配置

IDEA插件

在IDEA中安装好PlantUML插件(和markdown插件类似,有自己的UML描述语言,在编写后能事实反应到UML图中)后,按照官方文档的提示File->New->PlantUML File开始我的第一个类图

plantuml 依赖_遇见PlantUML

然而,我在编写如上右侧的代码后,右边显示的确实一个异常:

plantuml 依赖_遇见PlantUML

这是因为PlantUML依赖Graphviz,我们需要先下载它(该链接是Windows的.msi安装包,若是其它平台,可在参考https://www.graphviz.org/download/)

安装之后需要为其配置环境变量GRAPHVIZ_DOT,为安装目录下的/bin/dot.exe,如图

plantuml 依赖_遇见PlantUML

然后重启IDEA,PlantUML标签窗口就能根据你输入的PlangUML language实时绘图了

plantuml 依赖_遇见PlantUML

PlantUML

上节是PlantUML作为插件在IDEA中的使用,作为独立的产品,自然也能够独立运行,本节就介绍通过运行jar的方式使用PlantUML

首先下载该产品对应的jar,然后在该jar所在路径运行java -jar plantuml.jar即可启动该应用:

plantuml 依赖_遇见PlantUML

然后点击Change Directory选择一个目录作为workspace,这里我选的是D:\Work_Space\UML,后续PlantUML源文件和对应生成的图片都将放在此目录。

在workspace中新建源文件,如test.txt,键入如下代码:

@startuml

class HelloWorld

@enduml

保存后,在GUI中双击该文件即可打开对应的绘图窗口,并且每次保存源文件都会自动触发重新绘图:plantuml 依赖_遇见PlantUML

类图

使用PlantUML可以画出很多中图,可参考官方文档,本文仅介绍IDEA中类图的画法。

类之间的关系

泛化/IS-A

IS-A通常用来表继承关系,用空心三角形加实线来表示,语法为Parent

@startuml

Person

@enduml

plantuml 依赖_遇见PlantUML

你也可以像下面写代码一样表述关系,extends将被识别

@startuml

class Person{

age : int

gender : char

}

class Student extends Person{

grade : String

}

@enduml

plantuml 依赖_遇见PlantUML

实现

实现一般针对接口,符号为三角形加虚线,语法为Flyable

@startuml

interface Flyable{

void fly();

{abstract} double getSpeed();

}

class Vehicle{

int speed;

{abstract} void run();

}

Flyable

Vehicle

@enduml

plantuml 依赖_遇见PlantUML

聚合Aggregation

语法:空心菱形加实线Department o– Employees

Aggregation聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义,例如一个部门由多个员工组成。与组合关系不同的是,整体和部分不是强依赖的,即使整体不存在了,部分仍然存在,例如:部门撤销了,人员不会消失,他们依然存在

@startuml

class Employee{

}

class Department{

Employee[] employees;

}

Department o- Employee

@enduml

plantuml 依赖_遇见PlantUML

一个-会画横线,两个-会画竖线,如o–会画竖线

组合Composition

语法:实心菱形+实线ArrayList *- Element

Composition组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了,例如:公司不存在了,部门也将不存在了

@startuml

class Element{

}

class ArrayList{

Element[] elements

}

ArrayList *- Element

@enduml

plantuml 依赖_遇见PlantUML

由于在Java中,内存管理对于我们是透明的。不像C语言,可能我们调用free(company)释放结构体对象company的内存,那么其成员departmentList也会被销毁。Java的自动内存管理机制是只要该对象到GC Roots是可达的(即能够与引用链连上)那就不会被回收。因此,在Java中,这两种关系的界限并不分明。

关联关系Association

语法:实线+箭头,->/或/

关联关系是用一条直线表示的;它描述不同类的对象之间的结构关系;它是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;

比如,乘车人和车票之间就是一种关联关系;学生和学校就是一种关联关系;

关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示A知道B,但 B不知道A;

@startuml

class Controller{

Service service;

}

class Service{

Dao dao;

}

class Service2

class Dao

Controller -> Service

Service Service2

Service -> Dao

@enduml

plantuml 依赖_遇见PlantUML

依赖

语法:

依赖也容易和关联弄混,但与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化, 依赖关系也可能发生变化

显然,依赖也有方向,双向依赖是一种非常糟糕的结构,我们总是应该保持单向依赖,杜绝双向依赖的产生;

在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系除了临时知道对方外,还是“使用”对方的方法和属性;

@startuml

class UserController{

void insertUser(User user)

}

class User{

}

UserController .> User

@enduml

plantuml 依赖_遇见PlantUML

关于类图的入门介绍到此为止,有兴趣的同学可参考官网进一步学习,并在学设计模式之后借助类图梳理流程和思路,以达到事半功倍的效果~

参考资料

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226834.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mysql优化 面试_数据库优化工具

    mysql优化 面试_数据库优化工具点赞是一种积极的生活态度!有支持才有动力!微信搜索公众号【达摩克利斯之笔】获取更多资源,文末有二维码!前言数据库优化是一个老生常谈的问题,刚入门的小白或者工作N年的光头对这个问题应该都不陌生,你要面试一个中高级工程师那么他就想”哥俩好”一样那么粘,面试官肯定会问这个问题,这篇文章我们就和它哥俩好!而且这个问题就是一个送分题,数据库的优化方案基本就是那些,答案也都是固定的,大家只要好好…

    2022年10月24日
  • C# Grid StackPanel DockPanel WrapPanel

    C# Grid StackPanel DockPanel WrapPanelWPF面板布局介绍Grid、StackPanel、DockPanel、WrapPanel回顾       上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当然这些都是本人在实际项目中的使用经验,可能还存在错误之处,还请大家指出。本文大纲1、Grid2、StackPanel3、DockPanel…

  • 遍历ArrayList时如何正确移除一个元素「建议收藏」

    遍历ArrayList时如何正确移除一个元素「建议收藏」一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为”abc”的字符串元素,请用代码实现。方法一、for循环遍历很简单,直接上代码:importjava.util.*;publicclassTest1{ publicstaticvoidmain(Stringargs[]){ List<String…

  • 二进制与十进制的转换教案「建议收藏」

    二进制与十进制的转换教案「建议收藏」【教学目的与要求】1、熟悉数制的概念;2、掌握位权表示法; 3、熟练掌握二进制与十进制之间的转换方法。【课时安排】1课时。【教学重点与难点】1、难点:位权表示法 十进制转化为二进制   2、重点:二、十进制间相互转换【教学过程】(以下教师的语言、活动简称“师”,学生的活动简称“生”)新课导入师:猜一猜:简单的数字:10,这是几?     我认为这是2…

    2022年10月17日
  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析

    缓存穿透,缓存击穿,缓存雪崩解决方案分析前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案

  • String.Split()函数

    String.Split()函数

    2021年11月13日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号