UML类图全解析

1.UML的基本介绍

1.1什么是UML

        1.UML => 统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。

        2.UML本身是一套符号的规定,就像数学符号和化学符号一样,这样符号用于描述软件模型中各个元素和他们之间的关系,比如:类,接口,实现,泛化,依赖,组合,聚合等。

        3.使用UML来进行建模,比较老牌的工具是Rational Rose,eplise的一些插件,IDEA的插件:PlantUML,当然也可可以使用现代化的工具:Lucidchart,博思画板等进行建立UML模型。

1.2UML图

1.2.1什么是UML图

        画UML图的目的其实就是为了将自己的思想描述给别人,既可以对自己的抽象思路进行完整的实际复现,也可以将自己的思路呈现给别人去理解想法(软件是如何设计的),UML图在软件工程中很重要。

1.2.2UML图的分类

        1.用例图

        2.静态结构图:类图,对象图,包图,组件图,部署图。

        3.动态行为图:交互图(时序图与协作图),状态图,活动图。

        对于进行理解设计模式来说,类图是最重要的(描述类与类之间的关系),因为本身就是进行使用类来进行对Java程序软件架构。

2.UML类图的大体设计

2.1类图元素的结构拆分

        类图中进行表示一个类的时候,结构按以下的方式进行划分。

2.2类图元素中的符号是什么

        - 代表private,私有的。

        + 代表public,公有的。

        # 代表protected,受保护的。

        ~ 代表package/default,包可见的。

2.3类图中的依赖关系

        这里仅仅列举出几个较为常见的,详细的在后面进行介绍。

2.3.1继承关系

        继承(Inheritance)=> 进行使用实线 + 空心三角进行表示。

2.3.2依赖关系

        依赖(dependency)=> 进行使用实线中标识出依赖的具体关系的方式进行表示。

2.3.3聚合关系

        聚合(Aggregation)=> 进行表示两个类之间有聚合关系时使用空心菱形进行标识。

2.3.4组合关系

        组合(Composition)=> 进行使用实心菱形标识两个类之间具有组合关系。

3.详解UML类图中类关系的设计

3.1依赖关系

        依赖关系(Dependency)

3.1.1什么是依赖关系

        只要在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方,连编译也无法通过。

3.1.2UML类关系设计方案

        这样就体现出来PersonServiceBean类中的对IDCard,Person,PersonDao,Department进行了依赖。

3.1.3PersonServiceBean类的设计

        可以看到PersonServiceBean分别在字段/方法参数/返回值/局部变量中进行运用到了这些类,所以说与这些类的关系是依赖关系。

public class PersonServiceBean {

    private PersonDao personDao;
    public void save(Person person) {}
    public IDCard getIDCard(Integer personId) {
        return new IDCard();
    }
    public void modify() {
        Department department = new Department();
    }

}

3.2泛化关系

        泛化关系(Generalization)

3.2.1什么是泛化关系

        泛化关系其实就是继承关系,它是依赖关系的特例。

3.2.2UML关系图的设计

        这样就可以看出来,PersonServiceBean和DaoSupport是泛化(继承)关系。

3.2.3代码示例

        定义的抽象类:

public abstract class DaoSupport {
    public void save(Object entity) {
    }
    public void delete(Object id) {
    }
}

        定义的实现类:

public class PersonServiceBean extends DaoSupport {
}

3.3实现关系

        实现关系(Implementation)

3.3.1什么是实现关系

        实现关系就是A类实现了B接口,是依赖关系的特例。

3.3.2UML关系图的设计

        其中PersonService是一个接口,PersonServiceBean是一个实现类。

3.3.3代码示例

public interface PersonService {
    void delete(Integer id);
}
public class PersonServiceBean implements PersonService {
    @Override
    public void delete(Integer id) {
        System.out.println("delete X");
    }
}

3.4关联关系

        关联关系(Association)

3.4.1什么是关联关系

        关联关系其实就是类与类之间的联系,是依赖关系的特例。

        关联关系具有导航性:即双向关系或者单向关系。

        关系具有多重性:

                1."1":标识有且仅有一个。

                2."0...":表示0个或者多个。

                3."0, 1":表示0个或者一个。

                4."n...m":表示n到m个都可以。

                5."m...*":表示至少m个。

3.4.2单向关联关系

3.4.2.1UML类图的设计

        这个UML类图进行展示的就是Person和IDCard单向的关联关系(Association)

        Person使用字段单向进行关联IDCard类。

3.4.2.2代码示例
public class IDCard {
}
public class Person {
    private IDCard idCard;
}

3.4.3双向关联关系

3.4.3.1UML类图的设计

3.4.3.2代码示例
public class IDCard {
    public Person person;
}
public class Person {
    private IDCard idCard;
}

3.5聚合关系

        聚合关系(Aggregation)

3.5.1什么是聚合关系

        聚合关系(Aggregation)表示的是整体和部分之间的关系,聚合关系最大的特征就是描述的整体和部分的关系,是可以分开的,并不是锁定强聚合的关系。聚合关系是关联关系的特例,所以它具有关联的导航性(单向/双向)和多重性(关联了多少个)。

3.5.2具体案例分析什么是聚合关系

        在生活中我们可能会使用电脑,使用电脑的时候需要进行装配键盘,显示器等,我们进行装配在台式主机上面的这些外设基本上都是可有可无的设备,可以插拔的。

        我们将主机进行抽象为Computer类,里面准备了两个字段,一个mouse进行装配Mouse,一个monitor进行装配Monitor。

        将鼠标抽象为Mouse类。

        将Monitor抽象为Monitor类。

        主机可以进行装配鼠标和显示器,其实就是Computer类可以进行装配Mouse类和Monitor类,并且由于主机没有这俩也能正常进行运行,所以Computer可以选择装配Mouse类,Monitor类,所以Computer类与Mouse类/Monitor类的关系是聚合的关系。

        聚合最重要的是可以将类聚合在本类中,也可以不聚合在本类中,一般是使用一个setter方法进行设置,可以设置,也可以不设置,这就是聚合。

3.5.3UML类图的设计

3.5.4代码示例

public class Monitor {
}
public class Mouse {
}
public class Computer {
    private Mouse mouse;
    private Monitor monitor;

    public void setMouse(Mouse mouse) {
        this.mouse = mouse;
    }

    public void setMonitor(Monitor monitor) {
        this.monitor = monitor;
    }
}

3.6组合关系

        组合关系(Composition)

3.6.1组合关系是什么?

        组合关系:就是整体与部分的关系,但是整体与部分不可以分开。

        这里要注意哦,聚合关系是可以分开的,组合关系是不可以分开的。

        组合关系的构建可以通过:1.内部直接组合(初始化时在内部直接进行)2.使用构造函数进行组合进去。

3.6.2使用内部直接进行组合

        内部直接进行组合就是在类初始化的时候,直接进行new一个相关对象。

3.6.2.1UML类图的设计

        在这里面进行设计的就是,IDCard对于Person是一个可组装也可以不组装的类,所以相互之间属于一个聚合的关系(Aggregation),但是Head类的对象在Person对象创建的时候,也会进行创建,生死与共,所以Head类与Person类属于是组合的关系(Composition)

3.6.2.2代码示例
public class Head {
}
public class IDCard {
}
public class Person {
    private IDCard idCard;
    private Head head = new Head();

    public void setIdCard(IDCard idCard) {
        this.idCard = idCard;
    }
}

3.6.3初始化时进行组合

        初始化时可以进行将字段中的需要进行组合进去的类的实例对象设置进去,这样也是一种组合的设计逻辑。

3.6.3.1UML类图的设计

3.6.3.2代码示例
public class Head {
}
public class IDCard {
}
public class Person {
    private IDCard idCard;
    private Head head;

    public Person(Head head) {
    }

    public void setIdCard(IDCard idCard) {
        this.idCard = idCard;
    }
}

3.6.4组合关系的精髓 => 不可分离性

        组合关系相对于聚合关系最大的不同就是不可分离性,聚合关系是可分离的,但是组合关系的设计理念就是不可分离的。

        Person与Head的不可分离性就体现在了创建Person对象的时候,会将Head对象一并进行创建,这就是不可分离特性的体现。

        虽然在我们的设计中,Person和IDCard在编码设计上是非强耦合的设计,但是如果在逻辑设计上,是一个强耦合设计(不可分离,同生共死)的设计时,其实这两个类也是要进行归结是组合关系(Composition)

        比如Person如果和IDCard是一个组合的关系,同生共死,那么其实在设计上,这两个就是组合关系,是同生共死的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值