zoukankan      html  css  js  c++  java
  • UML之类图

    类(Class)封装了数据和行为,是具有相同属性、操作、关系的对象集合的总称。

    类图(Class Dialog)使用系统中不同类来描述系统的静态结构,类图用来描述不同类和它们之间的关系。

    类图由三部分组成:

    (1)类名(每个单词的首字母均大写,中间无空格)

    (2)属性

             表达方式:可见性  名称:类型  [=默认值]

             可见性: +    public

                            -     private

                            #    protected

             (为了保证数据的封装性,可见性一般为private,私有属性是通过公有的set方法和get方法供外界使用的)

             名称:第一个单词首字母小写,后面单词首字母均大写,中间无空格

    (3)方法

             表达方式:可见性  名称(参数列表):返回类型

             可见性、名称的格式同上(构造方法首字母大写,没有冒号及后面的内容)

      

    类图之间的关系:

    1. 关联关系(Association)

    关联关系用来表示一类对象与另一类对象之间有联系,是一种结构化关系。

    比如汽车和轮胎,学生与班级,师傅和徒弟等。

    关联关系有如下6中类型:

    (1)双向关联

    默认情况下关联是双向的。

    例如顾客(Customer)购买商品(Product),反之,商品属于顾客。两者之间总是存在着联系。

    以下java代码与上图相对应:

    public class Customer
    {
        private Product[] products;
        
        ...
    
    }
    
    public class Product
    {
        private Customer customer;
        
        ...
    
    }

    (2)单向关联

    类的关联也可以是单向的。即类A包含类B对象的引用(类A包含指向类B对象的变量),而类B不包含类A对象的引用。

    例如:顾客(Customer)拥有地址(Address),而地址不拥有顾客的信息。

    以下java代码与上图相对应:

    public class Customer
    {
        private Address address;
        
        ...
    
    }
    
    public class Address
    {
        
        ...
    
    }

    (3)自关联

    一些类的属性对象的类型为该类本身。

    例如:一个节点类(Node)的成员也是一个节点对象。

    以下java代码与上图相对应:

    public class Node
    {
        private Node subNode;
        
        ...
    
    }

    (4)重数性关联

    即在关联关系的直线两侧增加数字来表示对应数量。

    m..n    表示另一个类的一个对象对应至少m个、最多n个本类对象

    1..1     表示另一个类的一个对象对应一个本类对象

    0..*     表示另一个类的一个对象对应零个或者多个本类对象

    例如:一个界面(Form)可以有零个或者多个按钮(Button),而一个按钮只属于一个界面。

    以下java代码与上图相对应:

    public class Form
    {
        private Button[] buttons;
        
        ...
    
    }
    
    public class Button
    {
        
        ...
    
    }

    (5)聚合关系(Aggregation)

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

    例如:汽车(Car)与发动机(Engine),发动机是汽车的组成部分,但也可以脱离汽车单独存在。

    正是由于发动机能脱离汽车单独存在,因此在类Car中并不直接实例化Engine,而是通过构造方法或者set方法将在外部实例化好的Engine对象以参数形式传进来(注入)。

    由于Car和Engine的实例化时间不同,所以它们之间不存在生命周期的制约关系。

    以下java代码与上图相对应:

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

    (6)组合关系(Composition)

    组合关系也表示整体和部分的关系,但是一旦整体对象不存在,部分对象也不能存在。

    例如:人的头(Head)和嘴巴(Mouth)是组合关系。

    Mouth对象的实例化是在Head类的构造方法中执行的,因此Head对象和Mouth对象同时被创建,两者具有统一的生命周期。

    以下java代码与上图相对应:

    public class Head
    {
        private Mouth mouth;
        
        public Head()
        {
            mouth = new Mouth();
        }
        
        ...
    
    }
    
    public class Mouth
    {
        
        ...
    
    }

    2. 依赖关系(Dependency)

    依赖关系是一种使用关系,即一个事务使用另一个事务。这个事务的改变可能会影响到使用该事务的其他事务。

    大多数情况下,依赖关系表现在一个类的方法使用了另外一个类的对象作为参数。

    例如:驾驶员开车,在Drive类中的drive()方法将Car类型的对象传递进来,以调用类Car中的move()方法。此时drive()依赖于move()方法,故Drive类依赖于Car类。

    以下java代码与上图相对应:

    public class Drive
    {
        public void drive(Car car)
        {
            car.move();
        }
        
        ...
    
    }
    
    public class Car
    {
        public void move()
        {
            ...
        }
        
        ...
    
    }

    依赖的3种方法:

    (1)构造函数传递依赖对象(构造函数注入)

    上例即为构造函数注入,通过构造函数将依赖对象传入。

    (2)Setter方法传递依赖对象(Setter注入)

    public class Drive{
        private Car car;
        public void setCar(Car car){
            this.car = car;
        }
    }

    通过set方法将依赖对象传入。

    (3)接口声明依赖对象(接口注入)

    当依赖类是接口类时,在声明的接口方法的传入参数是依赖对象。

    3. 泛化关系(Generalization,继承关系)

    泛化关系描述的父类与子类之间的关系(子类继承父类所有非私有的属性和方法),父类又称为基类或超类,子类又称为派生类。

    例如:Stuent类和Teacher类都继承自Person类。(相当于Student类和Teacher类都拥有3个属性、4个方法)

    以下java代码与上图相对应:

    public class Person
    {
        protected String name;
        protected int age;
        
        public void move()
        {
            ...
        }
        
        public void eat()
        {
            ...
        }
    
        public void say()
        {
            ...
        }
    }
    
    public class Student extends Person
    {
        private String studentNo;
        
        public void study()
        {
            ...
        }
    }
    
    public class Teacher extends Person
    {
        private String teacherNo;
        
        public void teach()
        {
            ...
        }
    }

    4. 接口与实现关系(Realization)

    在接口中,一般没有属性,而且所有的操作都是抽象的,只有方法的声明,没有方法的实现。

    实现接口的类必须实现接口中所有的方法,除非这个类是抽象的。

    (接口和接口之间也有继承关系和依赖关系)

    例如:交通工具接口Vehicle有一个抽象方法move(),在类Car和类Ship中都实现接口中的move()方法,但具体的实现细节可以不一样。

    以下java代码与上图相对应:

    public interface Vehicle
    {
        public void move();
    }
    
    public class Car implements Vehicle
    {
        public void move()
        {
            ...
        }
    }
    
    public class Ship implements Vehicle
    {
        private String teacherNo;
        
        public void move()
        {
            ...
            ...
        }
    }

     

    各种关系的强弱程度:

    依赖关系是类与类之间最弱的关系,是指一个类(依赖类)知道或临时使用另一个类(目标类),依赖类并不维护目标类,是一个典型的瞬时关系。

    关联关系是较强的关系,指一个类拥有另一个类的引用,表示类之间的一种非临时的(长期的)、非偶然的合作关系。

    聚合关系是更强的关系,代表两个类之间的整体和部分的关系(可分割),整体在概念上比部分高一个级别。

    组合关系是比聚合关系更强的关系,代表两个类之间的整体和部分的关系,但不可分割,在任何时候部分只能包含在一个整体中,两者生命周期相连。

    泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

    使用类图描述和分析6大设计原则与常见的设计模式   http://www.cnblogs.com/LangZXG/p/6204142.html

    注:转载请注明出处   http://www.cnblogs.com/LangZXG/p/6208716.html

  • 相关阅读:
    UE4 ios环境搭建备忘
    我所理解的打击感 逐帧分析过几十款游戏的开发者经验分享
    可重入锁和不可重入锁
    Java中JDK和JRE的区别是什么?它们的作用分别是什么?
    Java开发岗位面试题
    详解手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)
    docker:轻量级图形页面管理工具Portainer
    Docker整合dockerfly实现UI界面管理(单机版)
    docker for mac的JSON配置文件中的hosts项修改后无法生效
    Maven [ERROR] 不再支持源选项 5。请使用 6 或更高版本
  • 原文地址:https://www.cnblogs.com/LangZXG/p/6208716.html
Copyright © 2011-2022 走看看