PlantUML实现的UML类图绘制

Posted by Tao on Saturday, August 12, 2023

UML

UML即统一建模语言(Unified Modeling Language)。

类型关系

UML中类型之间有六大关系:

  • 泛化(Generalization)
  • 实现(Realization)
  • 关联
    • 组合关联(Composition)Contain-a
    • 聚合关联(Aggregation)Has-a
    • 普通关联(Association)A-A
    • 依赖关联(Dependency)Use-a

2.1.Generalization(泛化)

2.1.1.泛化关系

是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。

2.1.2.箭头指向

带三角箭头的实线,箭头指向父类。

@startuml
class Student {
    - score: int

    + getScore(): int
}

class Graduate{
    -salary:float
    +getSalary():float
}

Graduate --|> Student
@enduml
@startuml
class Student {
    - score: int
    + getScore(): int
}

class Graduate{
    -salary:float
    +getSalary():float
}

Student <|-- Graduate
@enduml

<|-- --|> 指定继承关系

2.2.Interface Realization(接口实现)

2.2.1.实现关系

是一种类与接口的关系,表示类是接口所有特征和行为的实现。

2.2.2.箭头指向

带三角箭头的虚线,箭头指向接口。..|>, <|..,圆点表示虚线。

@startuml
interface Shape{
    + draw()=0 :void
}

class Circle
{
    -x:int
    -y:int
    +draw():void
}
Shape <|.. Circle
@enduml
@startuml
interface Shape{
    + draw()=0 :void
}

class Circle
{
    -x:int
    -y:int
    +draw():void
}
Shape <|.. Circle
@enduml

2.3.Composition(组合关联)

2.3.1.组合关系

组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,它要求代表整体的对象负责代表部分的对象的生命周期。整体的生命周期结束也就意味着部分的生命周期结束。比如你和你的大脑。

2.3.2.箭头与指向

带实心菱形的实现,菱形指向整体。

2.3.3.类图关系

@startuml
Body *-- Brain
Body *-- Hand
@enduml
@startuml
Body *-- Brain
Body *-- Hand
@enduml

2.4.Aggregation(聚合关联)

2.4.1.聚合关系

聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如公司与员工的关系等。

@startuml
Family o-- Child
@enduml
@startuml
Family o-- Child
@enduml

2.5.Association(普通关联)

2.5.1.关联关系

是一种拥有的关系, 它使一个类知道另一个类的属性和方法,强调的是一种A-A的关系;关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

2.5.2.箭头和指向

带普通箭头的实心线,指向被拥有者。

2.5.3.类图关系

@startuml
Teacher "1"--> "1..n" Student
@enduml

2.5.4.示例代码

class Student;
class Teacher
{
public:
    void addStudent(Student *s)
    {
        vs.push_back(s);
    }
private:
    vector<Student*> vs;
};

class Student
{
public:
    void addTeacher(Teacher *t)
    {
        vt.push_back(t);
    }
private:
    vector<Teacher*> vt;
};

int main()
{
    Student *s1 = new Student, *s2 = new Student, *s3 = new Student, *s4 = new Student;
    Teacher *t1 = new Teacher, *t2= new Teacher, *t3 = new Teacher, *t4 = new Teacher;

    s2->addTeacher(t1);
    s2->addTeacher(t2);
    s2->addTeacher(t3);
    s2->addTeacher(t4);

    t1->addStudent(s1);
    t1->addStudent(s2);
    t1->addStudent(s3);
    t1->addStudent(s4);

    return 0;
}

2.6.Dependency(依赖关联)

2.6.1.依赖关系

是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。
比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个方法中使用。

2.6.2.箭头及指向

带箭头的虚线,指向被使用者

2.6.3.类图关系

@startuml
Person ..> Boat
Person ..> Computer
@enduml

2.6.4.示例代码

class Plane
{
public:
    void fly()
    {
        cout<<"travel to some where"<<endl;
    }
};
class Computer
{
public:
    void playGame()
    {
        cout<<"play my game"<<endl;
    }
};
class Person
{
public:
    void traval(Plane * plane)
    {
        plane->fly();
    }
    void entertain(Computer *cmp)
    {
        cmp->playGame();
    }
};
int main()
{
    Person per;
    Computer cmp;
    Plane plane;
    per.traval(&plane);
    per.entertain(&cmp);
    return 0;
}

—-未完待续—–

「如果这篇文章对你有用,请随意打赏」

Heisenberg Blog

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付


comments powered by Disqus