UML之轻松入门(1)-类图

曾经看到过一篇blog,上面探讨了学习UML和学习设计模式的区别,同时提出了学习UML还不如学习设计模式的观点。自我感受是,UML和设计模式在本质上属于完全不同的两个方向。设计模式是一种被反复使用、多数人知晓的、代码设计经验的总结。它可以更容易让人理解而且保证了代码的可靠性,而UML则是一种模型化和可视化的一种语言。可以这么说,设计模式是一种方法,它让我们的代码更有层次感
。而UML则是一种表达,它让我们的代码更加形象化。通过UML我们不必太过关注代码,不必担心客户是否了解相关的语言知识,整体的架构和功能的分析和实现成为我们的主要任务。应此,学习UML和设计模式都是很必要的。

UML是标准建模语言的简称,它是一个支持模型化和软件系统开发的图形化语言。为原件开发的所有阶段提供模型化和可视化支持。一般来说,软件开发可以分为5个阶段:1.需求分析阶段,主要是根据客户的需求进行系统功能建模,每一个客户需求都是一个用例。2.分析,主要是考虑需要解决的问题,利用逻辑图和动态图等方式描述系统特征。3.设计,主要是将分析阶段扩展为解决方案。4.构造,主要是吧设计阶段的类转化为相应的代码。5.测试,对系统进行单元和协同测试,以验证系统是否符合要求。

UML有3类主要的图,分别是静态图,动态图和物理图。其中静态图主要表示类、对象的结构和之间的关系。动态图表示在运行期间软件实体的变化。物理图则表示软件实体的不变物理结构,如源文件、2进制文件等。

现在通过实例观察类图的用法:

1.类的表示

例如在java中我们定义了一个Person类

   public class Person
{

private String name;

private int age;

public int publicId;

protected int className;

public void setName(String
name){

this. name =
name;

}

public String
getName(){

return this. name;

}

}

这个类在UML图中的表示是

从这个实例中我们看出:

1.类的组成:类名称写在第一排,类的属性写在第二排,类的方法写在第三排。+代表public-代表private#代表protected

2.类的属性:其格式为     (+|-|#)?(yourClassName):(type)

3.类的方法:其格式为     (+|-|#)?(yourClassName/((params)?/)):(type)     和类属性稍有不同的是,可以传入参数,“:”后代表的是传参的类型

 2.类的关联

类的关联大致包括3个方面,继承包含另一个类的引用接口

继承:

在java中定义一个Man类,让它继承Person类

public class Man extends Person
{

private int money;

public int getMoney()
{

return money;

}

public void setMoney( int money)
{

this. money =
money;

}

}

在UML图中可以这么表示

从这张图可以看出:我们可以用一个带空心三角形的符号来表示继承的关系。同时,箭头指向的类为超类箭头的源头为子类

包含另一个类的引用

在这里我们创建一个Woman类,它包含Man的一个引用。在实际生活中很多家庭主妇的钱都是老公赚的(除了女强人,哈哈)。因此,在Woman类中money属性的值是由Man的一个引用来决定的。代码实现如下:

public class Woman
{

private Man myMan;

private int money;

public int getMoney(){

this. money = myMan.getMoney();

return this. money;

}

public void setMyMan(Man
man){

this. myMan =
man;

}

}

用UML图我们可以这么表示:

从图中我们可以看到:当一个类拥有另一个类的引用时,应用带箭头的线表示,箭头指向为被引用的对象源头为引用者

这里要注意箭头的不同,继承为三角形,而引用则不是。

接口

java中接口是实现多态的重要一环,也是封装不可缺少的一部分。在UML中对接口的使用也有特殊的表示:

从图可以看出:UML中的接口用一个圆圈和一条直线表示。

 3.创建特殊的类

在java中我们常需要创建一个接口来实现封装。我们也常需要创建一个抽象类来实现多态。有时候,我们也要用一个静态类作为一个静态常量的容器。下面我们一起学习如何在UML中表示这些特殊的类。

接口类

在java中我们定义一个Student接口,这个接口要实现write()和read()方法。

public interface Student
{

public void write();

public void read();

}

这个接口在UML中的表示方法如下:

从图中我们可以看出:可以用<<interface>>来表示一个接口类。

静态类

我们在java中定义一个Math的静态类,其中定义PI的属性:

public class MathParams
{

static class Math
{

public static final double PI =
3.141592654;

}

}

这个静态类,我们在UML中可以这么表示:

从图中可以看出:可以用<<utility>>来表示一个静态类。

抽象类

在java中我们定义一个抽象Person类,这个Person类有两个方法,抽象的write()方法和具体的eat()方法(因为每个人都会吃,但不是每个人都会写字,呃...)。

public abstract class PersonAbstract
{

public abstract void write();

public void eat(){

//...

}

}

这个抽象类在UML中的表达方式是:

从图中可以看出,抽象的类和方法都用斜体 表示。因为本人用的是VISIO开发工具,其默认是用斜体表示。还有另一种表示方法是在抽象的类和方法后加上{abstract}约束。而且这个“{}”不仅可以加"abstract",还可以添加自己的属性,如{name
= "Lee",age = 13}。

 4.类图中的一些常用标记

这三种表示方法差别并不大,所以在大多数时候只采用第一种方式就行了。最后一种方式可以表示:两个类是组合在一起的,即Woman的一个对象复制后,它对应的那个Man对象也会复制。当Woman的一个对象清空时,那么它对应的那个Man对象也会被清空。

内部类是用一个圆圈中含有十字架加上一条线段组成(在VISIO中并未找到,还请了解的人相告)。

在包含类的引用时,当包含的引用不止一条时,我们就需要用一个容器装载包含的引用,可能是Vector,也可能是其他的。这时,我们可以用关联类的表示:

 5.一个简单的应用

这里是一个简单的二元树算法:

首先,为了更加容易的理解算法,我们回顾一下Comparable接口和Comparator接口。

Comparable和Comparator都实现了比较的功能,不能的是:1.Comparable是java.lang包,而Comparator是java.util包中。2.Comparable接口需要绑定到一个指定的类上,而Comparator则不需要。因此,comparator更加灵活。3.Comparable需要重写comparaTo方法,且只需传入绑定的对象一个参数,而Comparator需要重写compare方法,需要传入比较的两个对象,两个参数。下面我们用比较两个字符串的长度来看看两中方法的差别:

使用Comparable来比较两个字符串的长度:

//通过实现Comparable接口来自定义比较的规则,实现compareTo方法

 public class MyComparable implements Comparable<MyComparable>
{

//这个例子实现比较两个字符串的长度

private String compareString;

MyComparable(String compareString){

this. compareString =
compareString;

}

//这里重写两个比较的规则

@Override

public int compareTo(MyComparable
o) {

// TODO Auto-generated
method stub

return this. compareString.length()
- o.compareString.length();

}

}

使用Comparator来比较两个字符串的长度:

import java.util.Comparator;

//实现Comparator接口无需绑定类,可实现动态排序

   public class Mycomparator implements Comparator<String>
{

@Override

public int compare(String
o1, String o2) {

// TODO Auto-generated
method stub

return o1.length()
- o2.length();

}

}

了解了Comparable接口的用法后,我们来看简单的二元树的算法:

public class TreeMap
{

TreeMapNode topNode = null;

public void add(Comparable key,Object
value){

if( topNode == null)

topNode = new TreeMapNode(key,value);

else

topNode.add(key,value);

}

public Object
get(Comparable key){

return topNode == nullnull: topNode.get(key);

}

}

   class TreeMapNode {

public static final int LESS =
0;

public static final int GREATER =
1;

private Comparable itsKey ;

private Object itsValue;

private TreeMapNode nodes[]
new TreeMapNode[2];

public TreeMapNode(Comparable key,Object
value) {

// TODO Auto-generated
constructor stub

this. itsKey =
key;

this. itsValue =
value;

}

public void add(Comparable key,
Object value) {

// TODO Auto-generated
method stub

if( itsKey.compareTo(key) ==
0)

itsValue =
value;

else

addSubNode(selectSubNode(key),key,value);

}

private void addSubNode( int node, Comparable key,
Object value) {

// TODO Auto-generated
method stub

if ( nodes[node]
== null)

nodes[node]
new TreeMapNode(key, value);

else

nodes[node].add(key,
value);

}

private int selectSubNode(Comparable key)
{

// TODO Auto-generated
method stub

return ( key.compareTo(itsKey) <
0)? LESSGREATER;

}

public Object
get(Comparable key) {

// TODO Auto-generated
method stub

if( key.compareTo(itsKey) ==
0)

return itsValue;

return getSub(selectSubNode(key),key);

}

private Object
getSub( int node, Comparable key)
{

// TODO Auto-generated
method stub

return nodes[node]
== nullnull: nodes[node].get(key);

}

}

下面我们用UML图来表示这个类:

 6.总结

UML本来就是一个让代码更加形象的东东,应此不需要太过复杂。所以UML的内容最好比较简洁明朗,达到言简意赅的效果才是最好。

时间: 2024-08-02 19:32:32

UML之轻松入门(1)-类图的相关文章

UML之轻松入门(4)-OCP做一个上进的厨子

在上一章节,我们讨论了面向对象设计(OOD)5大特性之一的SRP原则.这一节,我们来看另一重要的原则:OCP原则(开放-闭合原则). Software entity should be open for extension, but closed for modification  上节回顾: 1.UML之轻松入门(1)-类图(附:java Comparable接口与Comparator接口用法) http://blog.csdn.net/woyunowuyuda/article/details

UML学习(二)-----类图

UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs.com/yangfengming/archive/2008/08/14/1267495.html http://www.cnblogs.com/huangxincheng/archive/2012/10/17/2728736.html http://www.cnblogs.com/playing/

UML视图(二)类图

心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间.因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗? 输入 第一行是一个整数T(1<T<1500),表示输入数据一共有T组. 每组测试数据的第一行是一个整数N(1&l

UML之轻松入门(3)-SRP做好厨子,让别人编程去吧

一个厨子可以做出一手好菜,也许他是新东方毕业的或者是祖传秘方.你让他做上一桌佳肴那是简单.快乐而又高效的,然而让他编程就会成为一种苦恼并且让人想不通的一件事.也许这个比喻不是很恰当,但是对于每个类来说,他们就像一个一个的actor,也许是厨子也许是司机,他们应该关注于自己的领域,这样会更加高效而且简明.源于这一思想,我们发现了SRP这个原则,即:单一职责原则. There should never be more than one reason for a class to change  既然

uml系列(四)——类图

类图是uml的核心.学习类图,总共需要掌握三个部分:类:类之间的关系:类图怎么画. 首先,类.老规矩,先来张图. 类是什么:举个简单的例子:猫.狗.猪三个都是动物.这里面的"动物"就是类,表示的是动物类. 在类图的表示中,类都包括一些什么呢?类图中的类都有以下部件: 1.名称,这是类的标识符,在同一个包内,类是不能重名的. 2.属性,比如说人类的属性就有:姓名.身高.年龄等等属性.在这里,有的属性可能不希望被每个人都知道,比如说年龄.所以又将属性的可见性分公有.私有.受保护和包内公有类

UML学习(一)类图和对象图

对象是一个概念,一种抽象或者事物.对象可以是具有现实意义的事物,也可以是抽象的一个概念.比如,一家公司或者一个进程. 类是一组对象的集合或者抽象的概念.类具有相同的属性和方法. 介绍完基本对象和类的基本概念.现在需要描述在UML中是如何表示对象和类,即如何画对象和类图.这里讲的只是一种通用的约定,属于一家之言. 类图:提供了对类及其关系进行建模的一种图形化的表示法,因此它也描述了可能存在的对象. 类图表示方法:一个方框,方框里是类名,属性和方法用横线分开. 属性表示方法:属性名:类型 = 默认值

转载:UML学习(二)-----类图(silent)

原文:http://www.cnblogs.com/huiy/p/8552607.html 1.什么是类图 类图(Class diagram)主要用于描述系统的结构化设计.类图也是最常用的UML图,用类图可以显示出类.接口以及它们之间的静态结构和关系. 2.类图的元素 在类图中一共包含了以下几种模型元素,分别是:类(Class).接口(Interface).依赖(Dependency)关系.泛化(Generalization)关系.关联(Association)关系.聚合关系(Aggregati

UML之轻松入门(2)-掌握Junit,让我们的开发更高效

使用UML不仅可以形象化的表达我们的程序思想,而且可以帮助我们提高程序的质量.一个杂乱无章的程序让维护者望而生畏,其成本也可想而知.在面向程序设计(OOD)中有5条原则是帮助我们设计一个高效.简洁的程序:1.单一职责原则(SRP) 2.开放-闭合原则(OCP) 3.Liskov替换原则(LSP) 4.依存关系倒置原则(DIP) 5.接口隔离原则(ISP).然而这5个原则不是本节讨论的重点,我们将从一个更简单基础的部分入手-JUnit. 想象一下如果程序中每增加一个功能或修改一些代码,都需要整个程

【UML】最简单的类图

Rational Rose简明实用教程  https://blog.csdn.net/gz153016/article/details/49641847 Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软件应用的组件构造.现在比较少的公司在使用已Rose.IBM推出了Rational Software Architect来替代Rational Rose. 如何用Rational Rose 画 组合聚合关系(实心菱形) 聚