• UML类图学习


    最近在学习设计模式,接触最多的就是先用UML类图画出这种设计模式。平常看其他人的博客多多少少也碰到UML类图,毕竟再多的文字,都没有一张图来的直白。掌握UML图其实对与java程序员来说,还是很有必要的。

    java中的类我们最熟悉不过了。比如我新建了一个下面的类

    public class Phone {
    
        private String name;
    
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        protected void call(){
    
        }
    
    }
    

    对应的Phone类的UML图为

    • 图分为三层:最顶层的为类名,中间层的为属性,最底层的为方法
    • 属性的表示方式为: 【可见性】 【属性名称】 :【类型】 = {缺省值,可选}
    • 方法的表示方式为: 【可见性】 【方法名称】 (【参数列表】):【类型】
    • 可见性都是一样的,'-' 表示private、‘+’表示public、‘#’表示protected

    继承关系

    继承关系是用于描述父子类之间的关系的,父类又称为基类或者超类。子类又称作派生类。( 记得之前看其他人的博客。看到超类。瞬间懵逼了,后来一查,就是父类,所以基础的东西一定要掌握牢固)

    下面定义个Mi和Oppo

    public class Mi extends Phone{
    
        private String miVersion;
    
        public void hot(){
    
        }
    }
    
    public class Oppo extends Phone {
    
        private String oppoVersion;
    
        public void beautiful(){
            
        }
    }
    

    对应的UML类图为

    • 泛化关系使用带空心三角形的实现来表示

    接口

    接口 大家平常经常用到,在接口中通常没有属性

    public interface  Language {
        public void hello();
    }
    

    对应的UML类图

    • 在方法上应当有《interface》,表示是一个接口

    实现关系

    我们定义了接口,就去实现接口

    public class Chinese implements Language {
        @Override
        public void hello() {
            System.out.println("你好");
        }
    }
    
    
    public class English implements Language{
        @Override
        public void hello() {
            System.out.println("hello");
        }
    }
    

    对应的UML类图

    • 使用空心三角形虚线表示

    关联关系

    关联关系是类与类 之间最常见的一种关系,它是一种结构化的关系。表示一类对象与另一类对象之间有联系。关联关系分单向关联、双向关联 、自关联

    单向关联

    单向关联指的是 关联只有一个方向,比如 我们程序员拥有电脑

    public class Computer 
    {
    
    }
    
    public class Programmer
    {
    	private Computer computer; 
    }
    

    对应的UML类图为

    双向关联

    双向关联的关系就是双向的,比如程序员买电脑 ,反之。电脑也 和程序员关联。这就是双向关联。

    public class Computer 
    {
    	private Programmer programmer;
    }
    
    public class Programmer
    {
    	//程序员不止一台电脑
    	private Computer[] computer; 
    }
    

    对应的UML类图为

    • 有的地方也会使用双向的箭头表示,碰到的时候 不要纠结于这个
    自关联

    自关联指的就是对象中的属性为对象本身,我首先就想到了单例模式

    public class Singleton {
    
        //构造函数私有化
        private Singleton(){
    
        }
    
        private static Singleton instance = new Singleton();
    
        public static Singleton getInstance(){
            return instance;
        }
    
    }
    

    对应的UML类图为

    依赖关系

    可以简单理解,就是一个类A使用到了类B.这种使用关系是具有偶然性的、临时性的。但是B的变化会影响到A. 比如,驾驶员(Driver)开车,Driver类的drive()方法将车(Car)的对象作为一个参数传递,以便在drive()方法中能够调用car的move()方法,且驾驶员的drive()方法依赖车的move()方法,因此也可以说Driver依赖Car

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

    对应的UML类图为

    • 用带箭头的虚线表示
    • 依赖关系通常通过三种方式来实现
      • 将一个类的对象作为另一个类中方法的参数
      • 在一个类的方法中将另一个类的对象作为其对象的局部变量
      • 在一个类的方法中调用另一个类的静态方法

    聚合关系

    聚合关系表示整体与部分的关系,在聚合关系中,成员对象实整体的一部分,但是成员对象可以脱离整体对象独立存在。比如电脑有 cpu,ssd

    public class Cpu
    {
    
    }
    
    public class Ssd
    {
    
    }
    
    public class Computer
    {
        private Cpu cpu;
        private Ssd ssd;
    
        
        public Computer(Cpu cpu, Ssd ssd)
        {
            this.cpu= cpu;
            this.ssd= ssd;
        }
        
    }
    
    

    对应的UML类图

    • 用空心菱形直线表示
    • 代码实现聚合关系,成员对象通常以构造方法、Setter方法的方式注入到整体对象之中。

    组合关系

    组合关系也表示的是一种整体和部分的关系。但是在组合关系中整体对象可以控制成员对象的声明周期,一旦整体对象不存在,成员对象也不存在,有种同生共死的感觉。比如人的 头 和嘴巴、鼻子。嘴巴和鼻子是头的组成部分之一,一旦头没了,嘴巴也没有了(好可怕)。

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

    对应的UML类图

    • 用实心菱形直线表示

    基本上常用的都介绍完了,不过实际应用中,不必完全纠结于细节,合理的利用对象之间的关系给出合理的设计方案即可

    对了。我先在画图都是用在线的 processon


  • 相关阅读:
    JAVA识别字符串是数字(英文)还是汉字,web页面进行字符截断的帮助类
    linux不解压超大日志gz包直接查找特定内容
    Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
    Caffe学习系列(10):命令行解析
    Caffe学习系列(9):运行caffe自带的两个简单例子
    Caffe学习系列(8):solver优化方法
    Caffe学习系列(7):solver及其配置
    Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写
    Caffe学习系列(5):其它常用层及参数
    Caffe学习系列(4):激活层(Activiation Layers)及参数
  • 原文地址:https://www.cnblogs.com/zhenghengbin/p/9246615.html
Copyright © 2020-2023  润新知