UML类图

来源:互联网 发布:联通合约机 知乎 编辑:程序博客网 时间:2024/05/21 09:07

前言

用PHP开发两年多了,准备也写一下平时常用的设计模式,都是基于自己的实践经验,当然,用设计模式之前首先要看懂设计模式,因此这里首先讲解一下UML类图。通过UML类图,能更好的和大家交流,也能很容易就表达出自己的设计想法

最近也学习了Java,也不抵触其他编程语言的学习了,因此有些博客题目需要修改,例如UML类图的关系,是一个通用的知识,而不是只局限于PHP


UML

Unified Modeling Language(UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置


矩形框代表一个类,类图分为三层
  1. 第一层为类的名称,如果是抽象类则类名用斜体表示,如图中的动物类
  2. 第二层为类的特性(通常为类的成员属性)
  3. 第三层为类的操作(通常为类的成员方法)
注意:“+”代表public,“-”代表private,“#”代表protected

下图显示了一个雇员如何作为UML类建模。正如图中所示,类的名字是Employee,我们可以在中间区域看到Flight类的3个属性:name,age,email。在底部区域我们可以看到Flight类有5个操作:getName(),setName(String name),getAge(),setAge(int age),getEmail(),setEmail(String email)



上图对应的Java代码如下:

public class Employee {    private String name;    private int age;    private String email;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }}


接口

接口有两种表示方法:矩形表示法和棒棒糖表示法
  • 矩形表示法,顶端有<<接口>>或者<<interface>>,第一行为接口名称,第二行为接口方法
  • 棒棒糖表示法,圆圈旁为接口名称,接口方法在实现类中出现

下图给出了一个示例接口的UML图:



上图对应的Java代码如下:

public interface Instrument {    void play();    String what();    void adjust();}

UML类图中的关系

UML类图中的关系分为四种:泛化、依赖、关联、实现; 关联关系又可以细化为聚合和组合

泛化(Generalization)

泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以重写父类的行为



上图对应的Java代码如下:

abstract class Instrument {    public String what() {        return "Instrument";    }    public abstract void play();    public abstract void adjust();}class Wind extends Instrument {    @Override    public void play() {        System.out.println("Wind play!");    }    @Override    public void adjust() {        System.out.println("Wind adjust!");    }    public String what() {        return "wind";    }}class Stringed extends Instrument {    @Override    public void play() {        System.out.println("Stringed play!");    }    @Override    public void adjust() {        System.out.println("Stringed adjust!");    }    public String what() {        return "Stringed";    }}

依赖(Dependency)

依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性、临时性的,但是B类的变化会影响到A。表现在代码层面,为类A在某个方法中使用类B作为类A的方法参数、方法中的局部变量或者静态方法调用

在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方



上图对应的Java代码如下:

class Book {    public static final String name = "Java编程思想";    public void read() {        System.out.println("正在阅读" + Book.name);    }}class People {    public void doSomething(Book book) {        book.read();    }}

关联(Assocation)

关联是一种结构化的关系,指一种对象和另一种对象有联系。给定有关联的两个类,可以从一个类的对象得到另一个类的对象。关联有两元关系和多元关系,两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系

关联关系时通过类的成员变量来实现的



上图对应的Java代码如下:

class Company{    Employee[] employees;        public void companyRun() {        for (Employee emp : employees) {            emp.doWork();        }    }}class Employee {   Company company;      public void doWork() {       System.out.println("工作!");   }}

雇员作为公司的属性,不同于上面的依赖关系。依赖的话,雇员的改变会影响公司,显然这里不是。在这里,雇员仅仅作为公司的一个属性而存在,因此Employee与Company之间是关联关系。关联关系还可以细分为聚合和组合两种。

聚合(Aggregation)

聚合是一种特殊的关联。它描述了”has a“关系,表示整体对象拥有部分对象

关联关系和聚合关系从语法上是没有办法区分的,从语义上才能更好的区分两者的区别。聚合是较强的关联关系,强调的是整体与部分之间的关系

与关联关系一样,聚合关系也是通过类的成员变量来实现的



组合(Composition)

组合是聚合的一种形式,它具有更强的拥有关系,强调整体和部分的生命周期是一致的。整体负责部分的生命周期的管理。如果整体被销毁,部分也必须跟着一起被销毁,如果所有者被复制,部分也必须一起被复制

与关联关系一样,组合关系也是通过类的成员变量来实现的



聚合与组合的区别

1、聚合关系是”has-a“关系,组合关系是”contains-a“关系;
2、聚合关系表示整体与部分的关系比较弱,而组合比较强
3、聚合关系中代表部分的事物的对象与代表整体事物的对象的生存期无关,一旦删除了整体对象不一定就删除了代表部分事物的对象。组合一旦删除了整体对象,同时也就删除了代表部分事物的对象


实现(Realization)

实现关系指定两个实体之间的一个合约。换言之,一个实体定义了一个合约,而另一个实体保证履行该合约



上图对应的Java代码如下:

interface Person {    void speak();}class Student implements Person {    public void speak() {        System.out.println("学生说话!");    }}class Teacher implements Person {    public void speak() {        System.out.println("老师说话!");    }}


后记

趁着寒假前有时间,学习《java编程思想》的同时,顺便更新UML类图的知识