UML做業第二次:類圖中類的表示

1、plant UML語法學習小結css

1.類之間的關係html

使用.. 來代替 -- 能夠獲得點 線.java

在這些規則下,也能夠繪製下列圖形shell

@startuml
Class01 <|-- Class02 Class03 *-- Class04 Class05 o-- Class06 Class07 .. Class08 Class09 -- Class10 @enduml

@startuml
Class11 <|.. Class12
Class13 --> Class14
Class15 ..> Class16
Class17 ..|> Class18
Class19 <--* Class20
@enduml
@startuml
Class21 #-- Class22
Class23 x-- Class24
Class25 }-- Class26
Class27 +-- Class28
Class29 ^-- Class30
@enduml

二、關係上的標識

在關係之間使用標籤來講明時, 使用 :後接 標籤文字。ide

對元素的說明,你能夠在每一邊使用 "" 來講明.函數

@startuml

Class01 "1" *-- "many" Class02 : contains

Class03 o-- Class04 : aggregation

Class05 --> "1" Class06

@enduml
在標籤的開始或結束位置添加 或 以代表是哪一個對象做用到哪一個對象上。<>
@startuml
class Car

Driver - Car : drives >
Car *- Wheel : have 4 >
Car -- Person : < owns
@enduml

三、添加方法

爲了聲明域或者方法,你可使用 後接域名或方法名。學習

系統檢查是否有括號來判斷是方法仍是域。字體

@startuml
Object <|-- ArrayList

Object : equals()
ArrayList : Object[] elementData
ArrayList : size()

@enduml
也可使用 把域或者方法括起來{}

注意,這種語法對於類型/名字的順序是很是靈活的。this

@startuml
class Dummy {
  String data
  void methods()
}

class Flight {
   flightNumber : Integer
   departureTime : Date
}
@enduml

You can use {field} and {method} modifiers to override default behaviour of the parser about fields and methods.spa

@startuml
class Dummy {
  {field} A field (despite parentheses)
  {method} Some method
}

@enduml

4.定義可訪問性

一旦你定義了域或者方法,你能夠定義 相應條目的可訪問性質。

Character Icon for field Icon for method Visibility
- private
# protected
~ package private
+ public
@startuml

class Dummy {
 -field1
 #field2
 ~method1()
 +method2()
}

@enduml

你能夠採用如下命令停用這些特性 skinparam classAttributeIconSize 0 :

@startuml
skinparam classAttributeIconSize 0
class Dummy {
 -field1
 #field2
 ~method1()
 +method2()
}

@enduml

5.抽象與靜態

經過修飾符{static}或者{abstract},能夠定義靜態或者抽象的方法或者屬性。

這些修飾符能夠寫在行的開始或者結束。也可使用{classifier}這個修飾符來代替{static}.

@startuml
class Dummy {
  {static} String id
  {abstract} void methods()
}
@enduml

6.高級類體

PlantUML默認自動將方法和屬性從新分組,你能夠本身定義分隔符來重排方法和屬性,下面的分隔符都是可用的:--..==__.

還能夠在分隔符中添加標題:

@startuml
class Foo1 {
  You can use
  several lines
  ..
  as you want
  and group
  ==
  things together.
  __
  You can have as many groups
  as you want
  --
  End of class
}

class User {
  .. Simple Getter ..
  + getName()
  + getAddress()
  .. Some setter ..
  + setName()
  __ private data __
  int age
  -- encrypted --
  String password
}

@enduml

 

 

7.備註和模板

模板經過類關鍵字("<<"和">>")來定義

你可使用note left of , note right of , note top of , note bottom of這些關鍵字來添加備註。

你還能夠在類的聲明末尾使用note leftnote right,note topnote bottom來添加備註。

此外,單獨用note這個關鍵字也是能夠的,使用 .. 符號能夠做出一條鏈接它與其它對象的虛線。

@startuml
class Object << general >>
Object <|--- ArrayList

note top of Object : In java, every class\nextends this one.

note "This is a floating note" as N1
note "This note is connected\nto several objects." as N2
Object .. N2
N2 .. ArrayList

class Foo
note left: On last defined class

@enduml

 

8.更多註釋

能夠在註釋中使用部分html標籤:

  • <b>
  • <u>
  • <i>
  • <s><del><strike>
  • <font color="#AAAAAA"> or <font color="colorName">
  • <color:#AAAAAA> or <color:colorName>
  • <size:nn> to change font size
  • <img src="file"> or <img:file>: the file must be accessible by the filesystem

你也能夠在註釋中展現多行。

你也能夠在定義的class以後直接使用 note leftnote rightnote topnote bottom 來定義註釋。

@startuml

class Foo
note left: On last defined class

note top of Object
  In java, <size:18>every</size> <u>class</u>
  <b>extends</b>
  <i>this</i> one.
end note

note as N1
  This note is <u>also</u>
  <b><color:royalBlue>on several</color>
  <s>words</s> lines
  And this is hosted by <img:sourceforge.jpg>
end note

@enduml

 

 

9.連接的註釋

在定義連接以後,你能夠用 note on link 給連接添加註釋

若是想要改變註釋相對於標籤的位置,你也能夠用 note left on link, note right on link, note bottom on link。(對應位置分別在label的左邊,右邊,下邊)

@startuml

class Dummy
Dummy --> Foo : A link
note on link #red: note that is red

Dummy --> Foo2 : Another link
note right on link #blue
	this is my note on right link
	and in blue
end note

@enduml

 

 

10.抽象類和接口

用關鍵字abstractabstract class來定義抽象類。抽象類用斜體顯示。 也可使用interfaceannotation 和 enum關鍵字。

@startuml

abstract class AbstractList
abstract AbstractCollection
interface List
interface Collection

List <|-- AbstractList
Collection <|-- AbstractCollection

Collection <|- List
AbstractCollection <|- AbstractList
AbstractList <|-- ArrayList

class ArrayList {
  Object[] elementData
  size()
}

enum TimeUnit {
  DAYS
  HOURS
  MINUTES
}

annotation SuppressWarnings

@enduml

 

 

11.使用非字母字符

若是你想在類(或者枚舉)的顯示中使用非字母符號,你能夠:

  • 在類的定義中使用 as 關鍵字
  • 在類名旁邊加上 ""
@startuml
class "This is my class" as class1
class class2 as "It works this way too"

class2 *-- "foo/dummy" : use
@enduml

 

 

12.隱藏屬性、函數等

經過使用命令「hide/show」,你能夠用參數表示類的顯示方式。

基礎命令是: hide empty members. 這個命令會隱藏空白的方法和屬性。

除 empty members 外,你能夠用:

  • empty fields 或者 empty attributes 空屬性,
  • empty methods 空函數,
  • fields 或 attributes 隱藏字段或屬性,即便是被定義了
  • methods 隱藏方法,即便是被定義了
  • members 隱藏字段 和 方法,即便是被定義了
  • circle 類名前帶圈的,
  • stereotype 原型。

一樣可使用 hide 或 show 關鍵詞,對如下內容進行設置:

  • class 全部類,
  • interface 全部接口,
  • enum 全部枚舉,
  • <<foo1>> 實現 foo1 的類,
  • 一個既定的類名。

你可使用 show/hide 命令來定義相關規則和例外。

@startuml

class Dummy1 {
  +myMethods()
}

class Dummy2 {
  +hiddenMethod()
}

class Dummy3 <<Serializable>> {
	String name
}

hide members
hide <<Serializable>> circle
show Dummy1 methods
show <<Serializable>> fields

@enduml

 

13.隱藏類

你也可使用 show/hide 命令來隱藏類

若是你定義了一個大的!included 文件,且想在文件包含以後隱藏部分類,該功能會頗有幫助。

@startuml

class Foo1
class Foo2

Foo2 *-- Foo1

hide Foo2

@enduml

14.泛型(generics)

你能夠用 < 和 > 來定義類的泛型。

@startuml

class Foo<? extends Element> {
  int size()
}
Foo *- Element

@enduml

It is possible to disable this drawing using skinparam genericDisplay old command.

15.包

你能夠經過關鍵詞 package 聲明包,同時可選的來聲明對應的背景色(經過使用html色彩代碼或名稱)。

注意:包能夠被定義爲嵌套。

@startuml

package "Classic Collections" #DDDDDD {
  Object <|-- ArrayList
}

package net.sourceforge.plantuml {
  Object <|-- Demo1
  Demo1 *- Demo2
}

@enduml

 

 

16.包樣式

包能夠定義不一樣的樣式。

你能夠經過如下的命令來設置默認樣式 : skinparam packageStyle,或者對包使用對應的模板:

@startuml
scale 750 width
package foo1 <<Node>> {
  class Class1
}

package foo2 <<Rectangle>> {
  class Class2
}

package foo3 <<Folder>> {
  class Class3
}

package foo4 <<Frame>> {
  class Class4
}

package foo5 <<Cloud>> {
  class Class5
}

package foo6 <<Database>> {
  class Class6
}

@enduml

你也能夠參考下面的示例來定義包之間的連線:

@startuml

skinparam packageStyle rectangle

package foo1.foo2 {
}

package foo1.foo2.foo3 {
  class Object
}

foo1.foo2 +-- foo1.foo2.foo3

@enduml

 

 

17.命名空間(Namespaces)

In packages, the name of a class is the unique identifier of this class. It means that you cannot have two classes with the very same name in different packages.

In that case, you should use namespacesinstead of packages.

You can refer to classes from other namespaces by fully qualify them. Classes from the default namespace are qualified with a starting dot.

Note that you don't have to explicitly create namespace : a fully qualified class is automatically put in the right namespace.

@startuml

class BaseClass

namespace net.dummy #DDDDDD {
	.BaseClass <|-- Person
	Meeting o-- Person
	
	.BaseClass <|- Meeting
}

namespace net.foo {
  net.dummy.Person  <|- Person
  .BaseClass <|-- Person

  net.dummy.Meeting o-- Person
}

BaseClass <|-- net.unused.Person

@enduml

 18.自動建立命名空間

使用命令 set namespaceSeparator ??? 你能夠自定義命名空間分隔符(爲 「.」 之外的字符).

@startuml

set namespaceSeparator ::
class X1::X2::foo {
  some info
}

@enduml

禁止自動建立包則可使用 set namespaceSeparator none.

@startuml

set namespaceSeparator none
class X1.X2.foo {
  some info
}

@enduml

19.棒棒糖 接口

須要定義棒棒糖樣式的接口時能夠遵循如下語法:

  • bar ()- foo
  • bar ()-- foo
  • foo -() bar
@startuml
class foo
bar ()- foo
@enduml

20.改變箭頭方向

類之間默認採用兩個破折號 -- 顯示出垂直 方向的線. 要獲得水平方向的能夠像這樣使用單破折號 (或者點):

@startuml
Room o- Student
Room *-- Chair
@enduml

你也能夠經過改變倒置連接來改變方向

@startuml
Student -o Room
Chair --* Room
@enduml

也可經過在箭頭內部使用關鍵字, 例如leftrightup 或者 down,來改變方向

@startuml
foo -left-> dummyLeft 
foo -right-> dummyRight 
foo -up-> dummyUp 
foo -down-> dummyDown
@enduml

You can shorten the arrow by using only the first character of the direction (for example, -d- instead of -down-) or the two first characters (-do-).

Please note that you should not abuse this functionality : Graphviz gives usually good results without tweaking.

21.「關係」類

你能夠在定義了兩個類之間的關係後定義一個 關係類 association class 例如:

@startuml
class Student {
  Name
}
Student "0..*" - "1..*" Course
(Student, Course) .. Enrollment

class Enrollment {
  drop()
  cancel()
}
@enduml

也能夠用另外一種方式:

@startuml
class Student {
  Name
}
Student "0..*" -- "1..*" Course
(Student, Course) . Enrollment

class Enrollment {
  drop()
  cancel()
}
@enduml

 

 

22.皮膚參數

skinparam改變字體和顏色。

能夠在以下場景中使用:

  • 在圖示的定義中,
  • 在引入的文件中,
  • 在命令行或者ANT任務提供的配置文件中。
@startuml

skinparam class {
	BackgroundColor PaleGreen
	ArrowColor SeaGreen
	BorderColor SpringGreen
}
skinparam stereotypeCBackgroundColor YellowGreen

Class01 "1" *-- "many" Class02 : contains

Class03 o-- Class04 : aggregation

@enduml

 

 

Skinned Stereotypes

You can define specific color and fonts for stereotyped classes.

@startuml

skinparam class {
	BackgroundColor PaleGreen
	ArrowColor SeaGreen
	BorderColor SpringGreen
	BackgroundColor<<Foo>> Wheat
	BorderColor<<Foo>> Tomato
}
skinparam stereotypeCBackgroundColor YellowGreen
skinparam stereotypeCBackgroundColor<< Foo >> DimGray

Class01 <<Foo>>
Class03 <<Foo>>
Class01 "1" *-- "many" Class02 : contains

Class03 o-- Class04 : aggregation

@enduml

 

 

Color gradient

It's possible to declare individual color for classes or note using the # notation.

You can use either standard color nameor RGB code.

You can also use color gradient in background, with the following syntax: two colors names separated either by:

  • |,
  • /,
  • \,
  • or -

depending the direction of the gradient.

For example, you could have:

@startuml

skinparam backgroundcolor AntiqueWhite/Gold
skinparam classBackgroundColor Wheat|CornflowerBlue

class Foo #red-green
note left of Foo #blue\9932CC
  this is my
  note on this class
end note

package example #GreenYellow/LightGoldenRodYellow {
  class Dummy
}

@enduml

 

 

Help on layout

Sometimes, the default layout is not perfect...

You can use together keyword to group some classes together : the layout engine will try to group them (as if they were in the same package).

You can also use hidden links to force the layout.

@startuml

class Bar1
class Bar2
together {
  class Together1
  class Together2
  class Together3
}
Together1 - Together2
Together2 - Together3
Together2 -[hidden]--> Bar1
Bar1 -[hidden]> Bar2


@enduml

 

 

23.拆分大文件

有些狀況下,會有一些很大的圖片文件。

能夠用 page (hpages)x(vpages) 這個命令把生成的圖片文件拆分紅若干個文件。

hpages 用來表示水平方向頁面數, and vpages 用來表示垂直方面頁面數。

你也可使用特定的皮膚設定來給分頁添加邊框(見例子)

@startuml
' Split into 4 pages
page 2x2
skinparam pageMargin 10
skinparam pageExternalColor gray
skinparam pageBorderColor black

class BaseClass

namespace net.dummy #DDDDDD {
	.BaseClass <|-- Person
	Meeting o-- Person
	
	.BaseClass <|- Meeting

}

namespace net.foo {
  net.dummy.Person  <|- Person
  .BaseClass <|-- Person

  net.dummy.Meeting o-- Person
}

BaseClass <|-- net.unused.Person
@enduml
 

 

2、班級學生管理系統中的 —— 「學生」 類的屬性、方法

屬性:

學生基本信息:學號,姓名,性別 , 班級 ,

學生課程信息:課程號 , 課程名 , 成績 ,

學生選修課信息:學號,課程號,先修課。

 3、類圖腳本程序

@startuml
class 學生基本信息 {
姓名:string
學號:varchar
性別:string
班級:string

  __
  +添加信息
+修改信息
+刪除信息
+更新信息
+保存
}
class 學生課程信息{
課程號:varchar
課程名:string
成績:string
  __

  +查看課程
+課程成績
}
class 學生選修課信息 {
學號:varchar
課程號:varchar
先修課:string
  __
  +登陸
+查找先修課
+退出
}
學生課程信息 <--> 學生基本信息
學生選修課信息 <--> 學生基本信息
@enduml

4、類圖示例

相關文章
相關標籤/搜索