面向对象设计

对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做。伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现。如果要自己设计,无论是给自己看,还是给别人看,势必要输出一些文档,清晰地整理出思路。

关于文档,有些人会用文字,但是再多的文字在绝大多数人看来,都不会有一张图来得直白,本文就讲一讲使用UML图来进行面向对象的设计。

面向对象设计主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据

UML类图分为上下两篇,上篇是类、继承和实现三种关系,下面开始。

类的UML画法

Java是一门面向对象语言,那最基础的就类了。类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的职责,职责指的是类要完成什么样子的功能,要承担什么样子的义务。一个类可以有多种职责,但是设计得好的类一般只有一种职责。

假如我现在定义了这么一个类:

public class Person 
{
private String name = "Jack"; public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} protected void playBasketball()
{
pass();
} private void pass()
{
}
}

那么此类对应的UML为:

看到该图分为三层:最顶层的为类名,中间层的为属性,最底层的为方法。

属性的表示方式为:【可见性】【属性名称】:【类型】={缺省值,可选}

方法的表示方式为:【可见性】【方法名称】(【参数列表】):【类型】

可见性都是一样的,"-"表示private、"+"表示public、"#"表示protected

继承关系

继承也叫作泛化(Generalization),用于描述父子类之间的关系,父类又称为基类或者超类,子类又称作派生类。在UML中,泛化关系用带空心三角形的实线来表示。

假如现在我又定义了一个Student和一个Teacher:

public class Student extends Person 
{
private String studentNo; public void study()
{
}
}
public class Teacher extends Person 
{
private String teacherNo; public void teach()
{
}
}

那么,用UML表示这种关系应当是:

抽象继承关系

上面的继承是普通的继承,在Java中,除了普通的继承之外,众所周知的还有一种抽象的继承关系,因此就再讲讲抽象继承关系,作为上面的继承的补充。

比方说我想实现一个链表(Link),插入(insert)与删除(remove)动作我想让子类去实现,链表本身只实现统计链表中元素个数的动作(count),然后有一个子类单向链表(OneWayLink)去实现父类没有实现的动作,Java代码为:

public abstract class Link
{
public abstract void insert();
public abstract void remove(); public int count()
{
return 0;
}
}
public class OneWayLink extends Link
{
public void insert()
{ } public void remove()
{ }
}

其UML的画法为:

在UML中,抽象类无论类名还是抽象方法名,都以斜体的方式表示,因为这也是一种继承关系,所以子类与父类通过带空心三角形的实线来联系。

实现关系

很多面向对象的语言中都引入了接口的概念,如Java、C#等,在接口中通常没有属性,而且所有的操作都是抽象的,只有操作的声明没有操作的实现。UML中用与类类似的方法表示接口,假设我有一个Animal:

public interface Animal 
{
public void move();
public void eat();
}

那么它的UML应当表示为:

很简单,注意在方法上应当有<<interface>>表示这是一个接口。接口一般没有属性,所以这里中间层没有,有属性要注意也都是常量。

接下来,有一个Dog和一个Cat实现了Animal:

public class Dog implements Animal 
{
public void move()
{ } public void eat()
{ }
}
public class Cat implements Animal 
{
public void move()
{ } public void eat()
{ }
}

此时应当使用带空心三角形的虚线来表示,UML应该是这样的:

两个抽象方法,Dog和Cat的实现将不一样,当然,在Dog和Cat之中,也可以增加Dog和Cat自己的变量和方法。

UML类图(上):类、继承和实现的更多相关文章

  1. UML类图与类间六种关系表示

    UML类图与类间六种关系表示 1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的 ...

  2. 设计模式之UML类图以及类间关系

    类图是描述系统中的类,以及各个类之间的关系的静态视图.能够让我们在正确编写代码以前对系统有一个全面的认识.类图是一种模型类型,确切的说,是一种静态模型类型.类图表示类.接口和它们之间的协作关系. 以下 ...

  3. UML类图介绍&类的六大关系

    UML类图介绍&类的六大关系 官方定义 UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,用于帮助软件开发人员进行思考和记录思路的方式 UML 图形化的语言 基本介绍 UML图: ...

  4. 【转】UML类图与类的关系详解

    UML类图与类的关系详解   2011-04-21 来源:网络   在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...

  5. UML类图与类的关系详解

    摘自:http://www.uml.org.cn/oobject/201104212.asp UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类 ...

  6. 3.UML中的类图及类图之间的关系

    统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...

  7. GOF 的23种JAVA常用设计模式总结 02 UML中的类图与类图之间的关系

    统一建模语言UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际 ...

  8. UML中的类图及类图之间的关系

    统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...

  9. UML 类图关系(继承,实现,依赖,关联,聚合,组合)

    1.继承(is-a)      指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能.并能够添加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系:在Java中此类 ...

  10. UML(一) 类图及类间关系

    原创文章,同步发自作者个人博客,http://www.jasongj.com/uml/class_diagram/ UML类图 UML类图介绍 在UML 2.*的13种图形中,类图是使用频率最高的UM ...

随机推荐

  1. HTTP协议系列(1)

    一.为什么学习Http协议       首先明白我们为什么学习HTTP协议,也就是说明白HTTP协议的作用.HTTP协议是用于客户端与服务器之间的通讯.明白了HTTP协议的作用也就知道了为什么要学习H ...

  2. 为C# as 类型转换及Assembly.LoadFrom埋坑!

    背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑 ...

  3. ASP.NET Aries 入门开发教程5:自定义列表页工具栏区

    前言: 抓紧时间,继续写教程,因为发现用户期待的内容,都在业务处理那一块. 不得不继续勤劳了. 这节主要介绍工具栏区的玩法. 工具栏的默认介绍: 工具栏默认包括5个按钮,根据不同的权限决定显示: 添加 ...

  4. [APUE]系统数据文件与信息

    一.口令文件 UNIX口令文件包含下表中的各个字段,这些字段包含在 由于历史原因,口令文件是/bin/passwd,而且是一个文本文件,每一行都包括了上表中的七个字段,字段之间用":&quo ...

  5. WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...

  6. 用scikit-learn学习DBSCAN聚类

    在DBSCAN密度聚类算法中,我们对DBSCAN聚类算法的原理做了总结,本文就对如何用scikit-learn来学习DBSCAN聚类做一个总结,重点讲述参数的意义和需要调参的参数. 1. scikit ...

  7. 强强联合,Testin云测&云层天咨众测学院开课了!

    Testin&云层天咨众测学院开课了! 共享经济时代,测试如何赶上大潮,利用碎片时间给女票或者自己赚点化妆品钱?   2016年12月13日,Testin联手云层天咨带领大家一起推开众测的大门 ...

  8. UVA, 10336 Rank the Languages

    难点在于:递归函数和输出: #include <iostream> #include <vector> #include <algorithm> #include ...

  9. Linux设备管理(四)_从sysfs回到ktype

    sysfs是一个基于ramfs的文件系统,在2.6内核开始引入,用来导出内核对象(kernel object)的数据.属性到用户空间.与同样用于查看内核数据的proc不同,sysfs只关心具有层次结构 ...

  10. 1199 Problem B: 大小关系

    求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...