类图

转载原文:https://blog.csdn.net/FBB360JAVA/article/details/80223898 

经常在书上看到类图,尤其是设计模式,很多复杂的逻辑用类图很容易表示出来,除了类图还有时序图,项目中同事画了很多时序图,下周学习下时序图。

类图主要信息包括三种:

1. 类名:每个类都必须有一个名字,类名是一个字符串。

2. 属性(Attributes):属性是指类的性质,即类的成员变量。

3. 类的操作(Operations):操作是类的任意一个实例对象都可以使用的行为,操作是指类的成员方法。

类图是使用频率最高的UML图之一。包含了:属性,行为(java中就叫做方法),类之间的关系。类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。

例:

public class Student {
    public String name;
    protected String sex;
    int age;
    private float javaScore = 100L;

    public Student() {

    }

    public float getJavaScore() {
        return javaScore;
    }

    public void setJavaScore(float javaScore) {
        this.javaScore = javaScore;
    }

    class Monitor{

    }

}

类图如下:

抽象类

其绘图方式、格式与普通类无异,只是类名使用斜体字。或者使用{Abstract}标记一下。 
例如下图(使用了斜体字): 

接口

通常使用<<interface>> 来标记。例如:

类之间的关系
谈及类之间的关系,常见的有继承,实现(类与接口之间),敢问兄台还能想到啥呢? 
这里的类之间的关系在定义上和名字上与继承等关系稍有不同! 
UML中,类之间的关系主要有:

1. 关联关系
是类与类之间最最常见的一种关系,用于表示一类对象与另一类对象之间有联系。通常将一个类的对象作为另一个类的属性。

在使用类图表示关系时可以在关联线上标注角色名,一般使用一个表示两者之间的关系的动词或名词表示角色名(并不是必须要写的)

public class Score {

}

class AverageScore{
    private Score score;
}

其实关联还可以细分:双向关联、单向关联、自关联、多重性关联、聚合关系、组合关系。

1.1 单向关联

使用带箭头的实线表示,就比如平均成绩AverageScore 中声明了一个返回值为Score 的变量。对的,所以上边那个例子就是一个单向关联。
1.2 双向关联

默认情况下是双向的,使用不带箭头的实线表示。

例如:

class Teacher {
    private Student[] students;
}

class Student{
    private Teacher myTeacher;
}

可以描述为:一个老师教好多个学生,学生都有同一个老师。

1.3 自关联

在系统中可能会存在一些类的属性对象类型为其本身,这种特殊的关联称为自关联。一般地,单例模式就是一个典型的自关联。


比如:这是一个特殊的管理者,在类成员的位置上声明了自己本身,这就是自关联。

public class SpecialManager {
    private SpecialManager specialManager;
}

1.4 多重性关联

多重性关联关系又称为重数性关联关系(Multiplicity),表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关联关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。

例子:

一个老师有一群学生(或0个),但是一个学生只属于一个老师。

 

1.5 聚合关系

表示一个整体与部分的关系,在聚合关系中,成员类是整体的一部分,即就是成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。

最最最典型的例子是:汽车发动机和汽车的关系,它们就是一个聚合关系。

/**
 * 汽车类
 * @author 
 */
class Vehicle {
    private Engine engine;

    public Vehicle(Engine engine) {
        this.engine = engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}

/**
 * 发动机类
 * @author 
 */
class Engine{

}

类图:

在上边的汽车类中,成员变量是一个发动机类型的,因为这是聚合(该变量可以脱离整体,就像是汽车的发动机坏了还能换新的,发动机也可以单独存在,所以不能直接实例化该发动机),所以使用有参数的构造器将外部实例化好的Engine对象传入到汽车类中,这个传入的过程叫做注入(Injection)。

所以,部分与整体之间不存在制约的生命周期,这也是聚合关系的一大特点。

1.6 组合关系 

与聚合关系相比较,也是整体与部分之间的关系。

它们的区别是:聚合关系中的{部分}是可以改的,就像是汽车可以换发动机;但是,组合关系中的{部分}却是不能修改的,就像是人与脑袋的关系(斜脸笑)。
例子:

class Man {
    private Head head;

    public Man() {
        head = new Head();
    }
}

class Head{

}

类图:

组合关系中,整体可以控制部分的生命周期。

另外,聚合和组合关系中,表示“部分”的那个类可以写在整体的内部,作为一个内部类出现。它们的共同点是,一个类的实例是另一个类的成员对象。

2. 依赖关系

依赖关系是一种使用关系:在需要表示一个事物使用另一个事物时使用依赖关系。在UML类图中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。

例子:程序员(Programmer)使用计算机(Computer

class Computer {
    /**
     * 计算机运行。
     */
    public void run() {

    }
}

class Programmer {
    /**
     * 程序员工作:使用计算机。调用计算机类中的运行的方法。
     * @param computer 计算机。
     */
    public void onWork(Computer computer) {
        computer.run();
    }
}

类图: 

注意:

在具体实现时,如果一个类的方法中调用了另一个类的静态方法,或在一个类的方法中定义了另一个类的对象作为其局部变量也是依赖关系中的一种表现形式,在设计阶段暂不考虑。

3. 泛化关系
其实就是继承关系(满足is a kind of),泛化关系用于描述父类与子类之间的关系。 
父类也叫做基类或者超类,子类又称作派生类。 
在UML中,使用带空心三角形的直线来表示。代码实现时,也是使用继承来实现泛化的。

/**
 * 超类:动物类。
 */
class Animal {

    private String name;//动物的名字
    private int age;//动物的年龄

    public void eat() {

    }

    public void sleep() {

    }
}

/**
 * 猴子继承了动物类。
 */
class Monkey extends Animal{

    private String MonkeyNumber;//猴子的编号

    public void eat() {
        super.eat();
    }
}

类图:

4. 实现关系

类与接口之间。相当于一个类实现了一个接口。 
例子:

结语

类图:用于结构视图,类图使用类来描述系统的静态结构,类图包含类和它们之间的关系,它描述系统内所声明的类,但它没有描述系统运行时类的行为。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值