学习笔记:PlantUML与设计模式几大原则

学习了一下如何绘制UML图以及设计模式的几大原则


使用PlantUML

这个和Markdown一样,先按照它的语法写UML,然后它的解释器可以将其绘制为UML图;官网上有详尽的教程

绘制类

  • + public
  • - private
  • # protected
  • ~ 无修饰符

一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@startuml
title 类

package com.example {
abstract class Base {
- {static} name: String
+ age: int

# {static} callname(): String
~ {abstract} absM() : void
}

interface I {
+ sayHi(): String
}
enum TimeUnit {
DAYS
HOURS
MINUTES
}
class C
}
@enduml

绘制出的图片如下


绘制类之间的关系

继承

<|--

子类指向父类 子类一定是知道父类定义的 但是反之不一定

1
2
3
4
5
6
@startuml
title 继承

Class01 <|--Class02 : 继承
note right on link#white: 这是继承关系
@enduml


接口

<|..

1
2
3
4
5
6
@startuml
title 接口实现
interface Dao
Dao <|.. Class03 : 接口实现
note right on link #white: 这是接口实现
@enduml


关联

<--

作为方法参数或者返回值

1
2
3
4
5
6
7
8
9
@startuml
title 关联
class 企鹅 {
+ 下蛋()
}
class 气候
气候<--企鹅 : 关联
note right on link #white: 这是关联关系
@enduml


依赖

<..

作为类中的一个属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@startuml
title 依赖
class 动物 {
+生命
+新陈代谢(氧气,水)
+繁殖()
}
class 氧气
class 水
水 <.. 动物
note right on link #white: 这是依赖关系
氧气<..动物
note right on link #white: 这也是依赖关系
@enduml


聚合

<--o

空器皿o可以放很多东西,has a 关系,独立生命周期

1
2
3
4
5
6
7
8
9
10
11
12
13
@startuml
title 聚合
class 大雁 {
+下蛋()
+飞行()
}
class 大雁群 {
+V形飞行()
+一形飞行()
}
大雁群 o--> 大雁
note right on link #white: 这是聚合关系
@enduml


组合

<--*

满器皿已经有实体存在 contains a 关系 相同的生命周期

1
2
3
4
5
6
7
8
9
10
@startuml
title 组合
class 翅膀
class 鸟 {
+羽毛
+下蛋()
}
鸟 "1" *--> "2" 翅膀
note right on link #white: 这是组合关系
@enduml


绘制时序图

  • -> 同步
  • ->> 异步
  • --> 返回
  • autonumber 开启自动计次
  • activate 启动
  • deactivate 结束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@startuml
title 时序图

actor Lifeline as u
participant "c:client" as c
participant "s:server" as s
participant "d:Device" as d
autonumber "0: "

u -> c : work
activate c

c -> s : open
activate s

s --> c:
deactivate s

c -> s : print
activate s

s -> d : write
activate d

d --> s :
deactivate d

s --> c :
deactivate s

c -> s : close
activate s

s --> c :
deactivate s

c --> u :
deactivate c
@enduml


设计模式几大原则

开闭原则

open and close

面向抽象编程,便于新增代码,不修改原有代码

如需对类添加功能,可以考虑编写子类继承,或者将该类作为新建类的成员


依赖倒置原则

dependency inversion

细节依赖抽象,实现接口或继承抽象类

减少耦合性


单一职责原则

single responsibility

干一件事情

接口,方法 最好遵守

类 不一定


迪米特法则(最少知道)

demeter

只与朋友交流,不和陌生人说话

朋友:成员变量,方法输入,输出参数

陌生人:方法体内部出现的类

1
2
3
4
5
6
7
8
9
class Course
class TeamLeader {
+checkNumberOfCourse()
}
class Boss {
+commandCheckNumber(TeamLeader)
}
Course <.. TeamLeader
TeamLeader <.. Boss

里式替换原则

A 换为 B 没有影响,原有功能未变: B 为 A 的子类

子类可以实现父类的abstract方法,或增加其特有方法,但是不能覆盖其非抽象方法

重载方法参数要比父类的更宽松,调用的话既可以调到父类方法也可以调到子类方法;反正则只能调用子类的方法了

返回值要比父类严格

防止继承泛滥: 开闭原则


组合复用原则

compositionaggregation

能用组合的就尽量不要使用继承