UML类图

作者: Qiansion齐木楠雄 | 来源:发表于2021-05-07 14:48 被阅读0次

    基本介绍

    UML(Unified Modeling Language)统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。
    UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和它们之间的关系。比如类、接口、实现、泛化、依赖、组合、聚集等。
    使用UML来建模,常用工具有Rational Rose,也可以使用一些插件来建模
    1)依赖

    依赖.png
    B中使用到了A
    2)关联
    关系表示类与类之间的连接,它使得一个类知道另外一个类的属性和方法。
    0..1 表示可以有0个或者1个实例
    0..* 表示对实例的数目没有限制
    1 表示只能有一个实例
    1..* 表示至少有一个实例
    关联关系体现的是两个类,或者类与接口之间的强依赖关系,这种关系很强烈,比依赖更强,不是偶然性的,也不是临时性的,而是一种长期性,相对平等的关系,表现在代码层面,为被关联的类B以类属性的形式出现在类A中,也可能是关联类A引用了被关联类B的全局变量。
    在Java中,关联关系是使用实例变量来实现的
    关联.png
    3)泛化
    泛化其实就是继承关系(B继承A)
    继承.png
    1. 实现
      B实现A接口
      实现.png
    2. 聚合
      聚合(aggregation)是关联关系的特例,是强的关联关系,聚合是整个与个体的关系,即has-a关系,此时整体和部分是可以分离的,他们具有各自的生命周期,部分可以属于多个对象,也可以被多个对象共享;比如计算机和CPU,公司与员工的关系;在代码层面聚合与关联是一致的,只能从语义上来区分。聚合关系也是使用实例变量来实现的,在java语法上区分不出关联和聚合,关联关系中类出于一个层次,而聚合则明显的在两个不同的层次。
      聚合.png
    3. 组合
      B类中存在A类通过new出来的对象,当然这样方法耦合度比其他方式要高,当B被实例化的同时,成员变量A也被实例化了。
      组合.png

    简单举例

    根据代码画类图

    public class Person {
        private Integer id;
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    Person类图.png

    强化类图关系

    类图-依赖关系

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

    public class PersonServiceBean {
        private PersonDao personDao;
        public void Save(Person person){}
        public IDCard getIDCard(int personId){
            return null;    
        }
        public void modify(){
            Department department = new Department();
        }
    }
    
    class PersonDao{}
    class IDCard{}
    class Person{}
    class Department{}
    

    这段代码中PersonDao,IDCard,Person, Department都与PersonServiceBean是依赖关系,因为都用到了。当然,此处Department和PersonServiceBean也是聚合的关系。不过这里用依赖关系表示也没有什么问题。


    依赖关系图.png

    依赖关系范围:
    ①类中用到了对方
    ②如果是类的成员属性
    ③如果是方法的返回类型
    ④是方法的接收参数类型
    ⑤方法中使用到

    类图-泛化关系

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

    public abstract class DaoSupport {
        public void save(Object entity){}
        public void delete(Object id){}
    }
    
    public class PersonServiceBean extends DaoSupport{
    }
    
    image.png

    类图-实现关系

    顾名思义,实现关系就跟它表面所述一致。

    public interface PersonService {
        public void delete(Integer id);
    }
    
    public class PersonServiceBean implements PersonService{
        @Override
        public void delete(Integer id) {
            
        }
    }
    
    image.png

    类图-关联关系

    它体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
    1 单向一对一

    public class Person {
        private IDCard idCard;
    }
    
    public class IDCard {
    }
    
    image.png
    看到这里,可能觉得关联跟聚合关系很像,的确,聚合就是特殊的关联关系,关联强调的是两个类之间的关系,而聚合更注重强调整体与部分之间的关系,即(has-a)
    2 双向1对1
    双方都知道对方的存在,都可以调用对方的公共属性、方法。
    public class Husband {
        private Wife wife;
    }
    
    public class Wife {
        private Husband husband;
    }
    
    image.png

    3 自身关联
    自己是自己的成员变量,这种子关联在C语言中的链表体现最为深刻。结合实际来说,就像电影盗梦空间里造梦一样。

    public class Dream {
        private Dream dream;
    }
    
    image.png

    类图-聚合关系

    聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

    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;
        }
    }
    
    image.png

    类图-组合关系

    组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束

    public class Computer {
        private Mouse mouse = new Mouse();
        private Monitor monitor = new Monitor();
    
        public void setMouse(Mouse mouse) {
            this.mouse = mouse;
        }
    
        public void setMonitor(Monitor monitor) {
            this.monitor = monitor;
        }
    }
    

    Computer创建时,Mouse和Monitor同时被创建,Computer销毁时,Mouse和Mointor也会被回收。


    image.png

    就像人有身体和身份证,身体与人是不可分的,而身份证则不是不可分的。则身体与人是组合关系,和身份证是聚合关系。

    总结

    依赖,泛化,实现,关联,聚合,组合。
    泛化和实现是依赖的特例,关联是依赖的特例,聚合和组合是关联的特例。所以最基本的就是依赖关系,根据细分分为其他五种关系。


    image.png

    相关文章

      网友评论

          本文标题:UML类图

          本文链接:https://www.haomeiwen.com/subject/jgkjdltx.html