当前位置: 首页 > 编程日记 > 正文

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

阅读本文大概需要 3.5 分钟。

本篇是设计模式系列的开篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统。

所以现在打算重写,加上距离现在也有一段时间了,也算是自己的一个回顾吧!

学而时习之,不亦说乎。

从零开始单排学设计模式的国服排位之旅,今天正式开启!

目前段位:定级赛

这篇文章来总结下UML类图,本来不打算讲UML类图的,因为我在学习设计模式的时候,一遇到有关UML的就会自动忽略,一看感觉就很复杂。

但是随着学习的深入,发现不掌握UML类图,对设计模式或者某一个框架没有整体的把控。所以与其逃避,不如敢于面对,今天就让我们一起来了解下什么是UML类图。

Let's Go!

前言

设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活。架构模式比设计模式大,架构模式是战略,而设计模式是战术。

设计模式分为3大类型:创建型,行为型,结构型,总共有23种。

UML类图

类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联、依赖、聚合等,还包括类的内部结构(类的属性和操作)。

类图描述的是静态关系,在系统的整个生命周期中都是有效的。

对象图是类图的实例,它们的不同之处在于对象图显示类图的多个对象实例,而不是实际的类。由于对象存在生命周期,所以对象图只能在系统某一时间存在。

UML基本图示法

虚线箭头指向依赖;

实线箭头指向关联;

虚线三角指向接口;

实线三角指向父类;

空心菱形能分离而独立存在,是聚合;

实心菱形精密关联不可分,是组合;

上面是UML的语法,在画类图的时候,清理类和类之间的关系是重点。

类的关系有泛化(Generalization)、实现(Realization)、依赖(Dependency)和关联(Association)。

其中关联又分为一般关联关系和聚合关系(Aggregation),合成关系(Composition)。

基本概念

类图(Class Diagram):类图是面向对象系统建模中最常见和最重要的图,是定义其他图的基础。

类图的主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。

类图的3个基本组件:类名、属性、方法。

详细解析

注:下面图片实例中的代码为C#代码,非Java代码!

继承关系

首先看到上图这个“动物”矩形框,它就代表一个类(Class)。

类图分三层

第一层显示类的名称,如果是抽象类,则就用斜体显示。

第二层是类的特性,通常就是字段和属性。

第三层是类的操作,通常是方法或行为。

在看到上图中的“飞翔”,它表示一个接口图,与类图的区别主要是顶端有<<interface>>显示。

第一行是接口名称,第二行是接口方法。

接口还有另一种表示方法,俗称棒棒糖表示法,就是唐老鸭类实现了“讲人话”的接口。

鸭子本来也有语言,只不过只有唐老鸭是能讲人话的鸭子。

注意动物、鸟、鸭、唐老鸭之间的关系符号,你就会发现它们都是继承的关系。

继承关系用空心三角形+实现来表示。

这里列举的几种鸟中,大雁是最能飞的,我让它实现了飞翔接口。

实现接口用空心三角形+虚线来表示。

在看下图中企鹅和气候两个类,企鹅是很特别的鸟,会游不会飞。更重要的是,它与气候有很大的关联。我们不去讨论为什么北极没有企鹅,为什么它们要每年长途跋涉。

总之,企鹅需要“知道”气候的变化,需要“了解”气候规律。

当一个类“知道”另一个类时,可以用关联(association)。

关联关系用实现箭头来表示。

我们再来看上图中大眼与雁群这两个类,大雁是群居动物,每只大雁都属于一个雁群,一个雁群可以又很多只大雁。

所以它们之间就满足聚合(Aggregation)关系。

聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。

聚合关系用实心的菱形+实线箭头来表示。

合成(Composition,也有翻译成“组合”的)是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样。

在这里鸟和其翅膀就是合成(组合)关系,因为它们是部分和整体的关系,并且翅膀和鸟的声明周期是相同的。

合成关系用实心的菱形+实现箭头来表示。

另外,你会注意到合成关系的连线两端还有一个数字“1”和数字“2”,这被称为基数。表明这一段的类可以有几个实例,很显然,一个鸟应该有两只翅膀。

如果一个类可能有无数个实例,则就用“n”来表示。关联关系、聚合关系也可以有基数的。

动物几大特征,比如有新陈代谢,能繁殖。而动物要有生命力,需要氧气、水以及食物等。也就是说,动物依赖于氧气和水。

他们之间是依赖关系(Dependency),用虚线箭头来表示。

结语

编程是一门技术,更加是一门艺术!

不能只满足于写完代码运行结构正确就完事,时常考虑如何让代码更加简练,更加容易维护,容易扩展和复用,只有这样才能可以真正得到提高。

切身感悟:自己几个月之前写完的代码,现在再来回顾,你会发现这代码简直了...,一团糟,甚至怀疑这代码不是出自自己之手(绝对是自己写的)。想着手优化,进行改进,又怕本来没问题的功能,改出问题,影响使用,然后又进入恶性循环了。。。这种情况要切记,一定要尽可能的避免!

写出优雅的代码也是一种很爽的事情!!!




往期精彩回顾

房东:你敢申报,我就涨房租!京东取消年终奖!

一千行MySQL详细学习笔记(值得学习与收藏)

你女朋友是高可用么?

在Java中如何优雅地判空

最近整个业内状态不太好,注意提防一些公司的小九九!

Java爬取并下载酷狗TOP500歌曲

如何计算服务器能够承受多大的pv?

程序员们,别再学习框架了!

专科程序员与本科程序员之间有什么区别?

程序员的一天是怎样过的?

从 0 开始手写一个Tomcat,7 步搞定!


相关文章:

10 单元测试使命

单元测试的使命前言单元测试要完成的内容总结前言 不同级别的测试的侧重点是不同的&#xff0c;单元测试也有它的使命所在。 单元测试要完成的内容 单元测试的重点主要包括验证功能的正确性、检查局部数据结构正确性、检查临界数据处理正确性、检查模块接口正确性和验证单元容…

MVVM test

示例代码 public class RegisterUserViewModel{public UserInfo userInfo { get; set; }public ICommand ClickCommand { get; set; }public RegisterUserViewModel(){userInfo new UserInfo();userInfo.Age 25;this.ClickCommand new DelegateCommand<object>(OnClic…

[SCOI2009]生日礼物

这道题很容易看出是一道单调队列题。 首先我们根据珠子的位置排序。 然后按顺序枚举一个个珠子。 如果该种珠子没有出现过标记上它的位置&#xff0c;如果出现过修改并打上当前位置。当所有珠子都出现后&#xff0c;将当前位置减去打标记位置最小的一个即为当前解。 可以证明正…

.Net(c#) 通过 Fortran 动态链接库,实现混合编程

c# 与 Fortran 混合编程解决方案主要有两种&#xff1a;1. 进程级的交互&#xff1a;在 Fortran 中编译为控制台程序&#xff0c;.Net 调用&#xff08;System.Diagnostics.Process&#xff09;&#xff0c;然后使用 Process 的 StandardOutput 属性读取控制台输出内容&#xf…

11关于集成测试

集成测试的必要性 前言集成测试集成测试模式和方法总结前言 差之毫厘,失之千里。 集成测试 单元测试的目的是确认软件单元能够满足所规定的要求,将一些单元按一定的要求合成在一起就组成了集合体。集成测试的目的是确认集合体能够正确地满足所规定的要求,集成后的各软件单…

Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包...

一&#xff0c;实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path….将依赖包添加到工程中后&#xff0c;eclipse不报错了。但是用Maven命令 mvn clean compile 时出错如下&#xff1a; 原因是在eclipse中添加了 exteneral jar后&#xff0c;还需要在…

Codeforces Educational round 58

Ediv2 58 随手AK.jpgD 裸的虚树&#xff0c;在这里就不写了 E 傻逼贪心&#xff1f;这个题过的比$B$都多.jpg #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <cstdlib> #include <queue> #includ…

VC 单文档程序 隐藏程序及任务栏图标

1 在APP类InitInstance()里 注释掉&#xff1a; m_pMainWnd->ShowWindow(SW_SHOW); 2 CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里加 AfxGetApp()->m_nCmdShow SW_HIDE; 3 隐藏任务栏图标&#xff1a; ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW…

12 集成测试方法之大棒集成方法

大棒集成方法大棒集成方法总结大棒集成方法 大棒集成方法先是对每一个子模块进行测试&#xff08;单元测试阶段&#xff09;&#xff0c;然后将所有模块一次性的全部集成起来进行集成测试。如图&#xff0c;先分别对A、B、C、D、E、F、G模块进行单元测试&#xff0c;然后按照设…

phonegap+emberjs+python手机店发展,html5实现本地车类别~

商城开发项目&#xff0c;现在需要做出APP&#xff0c;无奈出场前android但不是很精通。最后选择phonegap实现app。 由于之前办理购物车分为登陆和登陆后两种情况&#xff0c;登录前必须充分利用本地存储。而基于phonegap本地存储的发展是使用Html5的localstorage功能实现。特分…

世上最伟大的十个公式,1+1=2排名第七,质能方程排名第五

英国科学期刊《物理世界》曾让读者投票评选了“最伟大的公式”&#xff0c;最终榜上有名的十个公式既有无人不知的112&#xff0c;又有著名的Emc2&#xff1b;既有简单的-圆周公式&#xff0c;又有复杂的欧拉公式…… 从什么时候起我们开始厌恶数学&#xff1f;这些东西原本如此…

20位程序员关于求职的疑问,以及我给出的参考答案

作者&#xff1a;陆小凤首发&#xff1a;公众号【程序员江湖】阅读本文大概需要 6 分钟。前几天发了一条朋友圈对于求职小伙伴们提出的问题&#xff0c;我进行了收集整理&#xff0c;统一反馈。也许这20个问题也是你们遇到的问题&#xff0c;所以趁着年前赶紧把它发出来。以下2…

14 集成测试方法之自底向上集成方法

自底向上集成方法前言自底向上集成方法前言 集成测试方法没有好坏之分&#xff0c;只有哪个更适合。 自底向上集成方法 自底向上集成方法是从调用的底层开始逐级的向上集成&#xff0c;每测试完一个族群就将其挂到上一层的模块上。这种集成方法的特点是不需要写桩函数&#x…

JavaScript Document

document:文档对象 document.getElementById();//根据ID获取元素对象 document.getElementsByTagName();//根据标签名获取元素对象数组 document.getElementsByClassName();//根据类名获取元素对象数组 document.getElementsByName();//根据名字获取元素对象数组 document.crea…

effective C++ 读书笔记(11-28)

1: RAII 资源获得时机便是初始化时机 典型应用&#xff1a; 智能指针&#xff01; 2&#xff1a; 为什么 auto_ptr 指针复制之后 原指针就会变成NULL &#xff1a; 多分指针指向它 会被析构多次 delete 函数会多次调用 3&#xff1a; 我要再次留心 stl容器的数据结构 与 特性…

15 三明治集成方法和混合策略集成方法

三明治集成方法和混合策略集成方法 前言三明治集成方法混合策略集成方法总结前言 关于集成测试方法今天我们再学习两个方法,三明治集成方法和混合策略集成方法。 三明治集成方法 采用三明治方法的优点是:它将自顶向下和自底向上的集成方法有机地结合起来,不需要写桩函数,…

产品经理和程序员的爱恨情仇

产品经理跪求程序员&#xff0c;程序员跪求程序成功上线&#xff01;前几天纯银V在微博上发了一条微博「很多人吐槽“人人都是产品经理”这句话&#xff0c;其实在我看来&#xff0c;这句话的正确理解是“人人都应该学习产品经理的思维方式&#xff0c;来提升自己的专业能力”&…

DES加密算法安全性评估

DES加密算法应用误区 DES算法具有极高安全性&#xff0c;到目前为止&#xff0c;除了用穷举搜索法对DES算法进行攻击外&#xff0c;还没有发现更有效的办法。而56位长的密钥的穷举空间为256&#xff0c;这意味着如果一台计算机的速度是每一秒种检测一百万个密钥&#xff0c;则它…

css3伪元素选择器before 和 after 的使用

:before 的作用, 在子元素的最前面, 添加一个伪元素, 伪元素内容通过 content 控制,可以在content属性中写入文本内容&#xff0c;但是通常为空字符串。 :after 的作用, 在子元素的最后面, 添加一个伪元素, 伪元素内容通过 content 控制,可以在content属性中写入文本内容&#…

16 系统测试之功能测试

功能测试前言功能测试总结前言 系统测试一般要使系统软件运行于真实的硬件环境中&#xff0c;其更倾向于软硬件结合的测试。在本专题中主要介绍系统测试中的功能测试和性能测试。其他测试类型在本专题中咱不展开讲&#xff0c;会在以后的专题中详细说。 功能测试 对于功能测试…

TinyMCE的使用-安装

TinyMCE安装非常简单&#xff0c;它可以被初始化为<form>标签中的<textarea>&#xff0c;当提交表单时&#xff0c;TinyMCE编辑器的内容将作为<form>表单的一部分被提交。 步骤1&#xff1a;下载TinyMCE并将其放在网站服务器目录 下载TinyMCE将得到的zip包加…

查看存储过程死锁的存储过程

create proc p_lockinfokill_lock_spid bit1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示show_spid_if_nolock bit1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示asdeclare count int,s nvarchar(1000),i intselect ididentity(int,1,1),标志,进程IDspid,线程IDkp…

离群点检测算法-基础概念

定义&#xff1a; Hawkins给出的离群点的本质性定义&#xff1a;离群点是数据集中偏离大部分数据的数据&#xff0c;由于偏离其它数据太多&#xff0c;使人怀疑这些数据的偏离并非由随机因素产生&#xff0c;而是产生于完全不同的机制。 大致分类&#xff1a; 一例分析步骤&am…

17 性能测试

性能测试 前言性能测试性能测试的目标总结前言 系统级性能测试是验证系统做的好不好,进行性能测试的前提条件是系统做的是对的。 性能测试 系统级性能测试是为了发现系统性能问题或获取系统性能相关指标而进行的测试。一般在真实环境、特定负载条件下,通过工具模拟实际软件…

关于mysql archive存储引擎-专门存储审计和日志数据

来源:http://60.29.242.49/?p60 政府还有一个让数据库专家摊上更多事情的职能&#xff0c;就是安全控制和数据审计。 那些管理着海量数据仓库的企业官员常常得回答诸如“何人何时修改了什么”或者“何人何时查看了什么”这样的提问。那些拥有数以千计的员工&#xff0c;开展着…

使用bitblt提高GDI+绘图的效率(转)

最近在做使用GDI绘制K线界面发现传统的GDI绘制方式效率比较低&#xff0c;根本无法满足K线界面及时刷新的速度要求。 所以做了个GDI绘制图形界面的试验&#xff0c;改试验主要在一个600600的区域内每隔10MS绘制6060个点&#xff0c;每隔10MS改变其颜色&#xff0c;并记录每次绘…

Bruck:一个Web界面布局原型设计框架\n

Bruck是一个面向网页设计师的新型lo-fi原型系统&#xff0c;让设计师可以快速为客户构建响应式且易于访问的布局原型。设计师可以通过组合多达25个Web组件来建立各种布局原型。设计师还可以在Bruck提供的在线Playground中实时可视化组合布局。Bruck可以生成屏幕阅读器可访问和响…

白盒测试方法之语句覆盖测试

语句覆盖测试 概念需求示例测试用例分析设计测试用例脚本语句覆盖情况总结概念 语句覆盖法的基本思想是设计若干测试用例,运行被测程序,使程序中的每个可执行语句至少被执行一次。 需求示例 程序源代码如下: void func(int a, int b, double c

每天学习Linux(3)---pwd命令

Linux中用 pwd 命令来查看”当前工作目录“的完整路径。 简单得说&#xff0c;每当你在终端进行操作时&#xff0c;你都会有一个当前工作目录。 在不太确定当前位置时&#xff0c;就会使用pwd来判定当前目录在文件系统内的确切位置。 1&#xff0e;命令格式&#xff1a; pwd […

恢复Opera11.50地址栏的下拉列表按钮

恢复Opera11.50地址栏的下拉列表按钮 我觉得新版本里取消这个功能很蛋痛. -------------------------------------------------- http://www.stormcn.cn/post/1066.html Opera11.50的地址栏从外观上已经默认取消了下拉列表的点击按钮&#xff0c;就是那个在地址栏最右边的倒三角…