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

  • 相关阅读:
    jsp 特殊标签
    poj 1753 Flip Game 高斯消元 异或方程组 求最值
    zoj 3155 Street Lamp 高斯消元 异或方程组 求方案数
    poj1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组 模板
    zoj 3930 Dice Notation 模拟
    zoj 3157 Weapon 线段树求逆序对数
    hdu 1242 Rescue BFS+优先队列
    hdu 3466 Proud Merchants 贪心+01背包
    zoj 3689 Digging 贪心+01背包
    hdu 2602 Bone Collector 01背包模板
  • 原文地址:https://www.cnblogs.com/LangZXG/p/6208716.html
Copyright © 2011-2022 走看看