Android日积月累系列之五-类与类的关系和markdown画UML图

235 阅读5分钟

类与类的关系和markdown画UML图

UML类图

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

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

3.使用UML来建模,常用的工具有,Rational Rose,也可以使用一些插件来建模.

UML类图包含以下几个常用对象

Note 注释:

对你的UML图进行注释

Anchor to Note :

锚点到注释:

class 类 :

表示类,可以添加属性和方法

Interface:

表示接口

六大关系:

Dependency 依赖,使用
Association 表示关联
Generalization 表示泛化(继承)
Realization 表示实现
Aggregation 表示聚合(注意与组合的区别,setting方法组合一个外部实例化的一个对象.)
Composite (组合,内部实例化的一个对象,成员属性.)

UML图分类,

画UML图与写文章差不多,都是把自己的思想描述给别人看,关键在于思路和条理,

1.用例图(use case)

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

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

1.类图是描述类与类之间的关系的,是UML图中最核心的

2.在讲解设计模式时,我们必然会使用类图,为了能够把设计模式学到位,需要先学习类图

类图 Class Diagram

1.用于描述系统中的类(对象)本身的组成(属性和方法)和类(对象)之间的各种静态关系.

2.类之间的关系:依赖,泛化(继承),实现,关联,聚合与组合(六大关系)

3.类里面有属性,操作(方法)

依赖关系

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

PersonServiceBean用到了PersonDao,Person,IDCard,Department 这几个类.

什么情况算是依赖

1.类中用到了对方,(类里实例化了一个对象,并且用到了,或者其他情况)

2.如果是类的成员属性

3.如果是方法的返回类型

4.是方法接收的参数类型

public class PersonServiceBean {
   private PersonDao personDao;// 类
​
   public void save(Person person) {
   }
​
   public IDCard getIDCard(Integer personid) {
      return null;
   }
​
   public void modify() {
      Department department = new Department();
   }
​
}

泛化关系(继承)

泛化就是继承

如果A类继承了B类,我们就说A和B存在泛化关系

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

实现关系(类与接口)

实现关系,实际上就是A类实现了B类,他是依赖关系的特例

public interface PersonService {
    public void delete(Integer id);
​
}
​
public class PersonServiceBean implements PersonService{
​
   @Override
   public void delete(Integer id) {
      // TODO Auto-generated method stub
      System.out.println("delete..");
   }
​
}

关联关系 Association

联关系是一种强依赖的关系,假设有两个类,类A和类B,类B作为类A的成员变量存在,类A也可为类B的成员变量存在,如果互为成员变量则为双向依赖,否则为单向依赖

关联关系与依赖关系的区别在于,依赖关系是一种临时的关系,依赖关系主要体现在方法参数,当调用方法时才有关系,关联关系是一种长期的关系,主体现在成员变量,无论是否调用方法这种关系都存在。

关联关系实际上就是类与类之间的联系,他是依赖关系的特例

关联具有导航性,即双向导航关系或单向关系,关系具有多重性,如“1”(表示有且仅有一个),"0"(表示0个或多个),“0,1”(表示0个或者一个),"n,m"(表示n到m个都可以),“m...”*表示至少m个

单向一对一关系
public class Person {
    private IDCard card;
}
双向一对一关系
public class Person {
    private IDCard card;
}
​
public class IDCard {
    private Person person;
}

UML类图,略

聚合关系 Aggregation

聚合关系是一种has-a关系,假设有两个类,类A和类B,类A包含类B,类B是类A的成员变量,聚合关系和关联关系都体现在成员变量,它们的区别在于:关联关系双方是平级的,是个体和个体的关系,聚合关系双方不是平级的,是整体和部分的关系。

聚合关系(Aggregation)表示的是整体和部分的关系,整体与部分可以分开,组合不可分开,聚合关系是关联关系的特例,所以他具有的导航性和多重性。

如:一台电脑由键盘,显示器,等,组成电脑的各个配件是可以从电脑上分离出来的,使用带空心菱形实线来表示。

组合关系

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

组合关系与聚合关系的区别在于:聚合关系中部分离开整体仍可存活,组合关系中部分离开整体没有意义

案例:在程序中,我们定义了实体,Peson,IDCard,Head,那么Head和Person就是组合,IDCard和Person就是聚合

但是如果在程序中Person实体中定义了对IDCard进行级联删除,即删除Person时,连同IDCard一起删除,那么IDCard和Person就是组合了,

UML类图里的可见性

UML中,可见性分为4级

1、public 公用的 :用+ 前缀表示 ,该属性对所有类可见

2、protected 受保护的:用 # 前缀表示,对该类的子孙可见

3、private 私有的:用- 前缀表示,只对该类本身可见

classDiagram
    Animal <|-- Duck
    Animal <|-- Fish
    Animal <|-- Zebra
    Animal : +int age
    Animal : +String gender
    Animal: +isMammal()
    Animal: +mate()
    class Duck{
        +String beakColor
        +swim()
        +quack()
    }
    class Fish{
        -int sizeInFeet
        -canEat()
    }
    class Zebra{
        +bool is_wild
        +run()
    }
Animal+int age+String gender+isMammal()+mate()Duck+String beakColor+swim()+quack()Fish-int sizeInFeet-canEat()Zebra+bool is_wild+run()

定义返回类型

classDiagram
class BankAccount{
    +String owner
    +BigDecimal balance
    +deposit(amount) bool
    +withdrawal(amount) int
}
BankAccount+String owner+BigDecimal balance+deposit(amount) : bool+withdrawal(amount) : int

定义泛型

classDiagram
class Square~Shape~{
    int id
    List~int~ position
    setPoints(List~int~ points)
    getPoints() List~int~
}
​
Square : -List~string~ messages
Square : +setMessages(List~string~ messages)
Square : +getMessages() List~string~
Square<Shape>int idList<int> position-List<string> messagessetPoints(List<int> points)getPoints() : List<int>+setMessages(List<string> messages)+getMessages() : List<string>

六大关系表示

TypeDescription
<--Inheritance 继承
*--Composition 组合
o--Aggregation 聚合
-->Association 关联
--Link (Solid) 实线
..>Dependency 依赖
..Realization 实现
..Link (Dashed) 虚线
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
classAclassBclassCclassDclassEclassFclassGclassHclassIclassJclassKclassLclassMclassNclassOclassP

关系上的标签

我们可以用这些标签来描述两个类之间关系的性质。另外,箭头也可以用于相反的方向:

classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)
classAclassBclassCclassDclassEclassFclassGclassHclassIclassJclassKclassLclassMclassNclassOclassPInheritanceCompositionAggregationAssociationLink(Solid)DependencyRealizationLink(Dashed)

双向关系

关系可以有多种方式

关系联型可以是下面一种

TypeDescription
<Inheritance
*Composition
oAggregation
Association
<Association
Realization

And Link can be one of:

TypeDescription
--Solid
..Dashed

知识点有点多,详情请看classDiagram

idea显示类图 classDiagram

这一个需要ide旗舰版本才支持,android studio和idea社区版本都不支持

ArrayList.png

参考资料

classDiagram