• [emacs] Drawing uml under emacs org-mode using plantUML


    [emacs] Drawing uml under emacs org-mode using plantUML - 类图

     

    [emacs] Drawing uml under emacs org-mode using plantUML - 类图

    1 准备工作

     

    1.2 搭建plantuml环境

    1. 安装plantuml, 参考
    2. 下载相关lisp文件, ob-plantuml.el
    3. 将plantuml的安装路径, 加入到 ob-plantuml.el 文件中
      # line 44
      (defcustom org-plantuml-jar-path "/your/install/path/plantuml.jar"
        "Path to the plantuml.jar file."
        :group 'org-babel
        :version "24.1"
        :type 'string)
      
    4. (require 'ob-plantuml) 加入到init.el或是.emacs内

    1.3 先爽一下

    当上述的工作都完成之后, 就可以happy的使用plantuml这个神奇的工具了. 需要编辑的代码如下:

    Alice -> Bob: Authentication Request
    Bob --> Alice: Authentication Response
    

    在上述代码内部使用 <ctrl-c> <ctrl-c> 的快捷键就能够在下面获得相应的图像. 是不是很爽呀, ;)

    png/test.png

    2 PlantUML使用说明

     

    2.1 PlantUML 简介

    PlantUML 允许使用简单的直观的语言实现, 能够用来绘制:

    1. 序列图
    2. 用例
    3. 类图
    4. 行为图
    5. 结构图
    6. 状态图
    7. 对象图

    2.2 类图

    由于对于一个程序员而言, 类的设计相对于其他的绘图而言更为重要, 因此此处首先介绍了plantUML在类图绘制中的使用方法

    2.2.1 类之间的关系

    此处, 类之间的关系以及所使用的符号如下:

     
    联合, association <–
    扩展, extension <(竖线)–
    组成, composition *–
    聚集, agregation o–
    将表格中的 -- 替换成 .. 就能够获得相应的点线, 其中一个短线"<-"表示横向, 两个短线"<–"表示竖向

    对于上述的关系表示非常困惑, 不急, 慢慢看来, ;)

    1. Association 1 2 有两个类, A 和 B, 如果A够根据将消息发送给B, 或是B的实例能够影响A, 那么就称两者之间的关系为Association, 并且在一般情况下两者是相互的. 如下所示:
      class class1 as "A"
      class class2 as "B"
      class1 --> class2
      

      https://images0.cnblogs.com/blog/188068/201404/211609526072773.jpg

      class B {...}
      class A {
        B* itsB;
      }
      
    2. extension3, 也被称为继承关系, 或is-a关系.
      class food {
      };
      class apple : public food{
      };
      

      上面的关系就可以理解为, apple是food

      class class1 as "food"
      class class2 as "apple"
      
      class2 --|> class1
      

      https://images0.cnblogs.com/blog/188068/201404/211609534046130.jpg

    3. composition and aggregation. 对于这两者的理解wikpedia中有一段很好的描述 4:

      一个大学里面有很多的学院, 每个学院又有很多的教授. 当这个大学倒闭关门的时候, 原来存在的学院也就随着大学的关门而不存在了, 但是这些教授却依然活着. 因此, 学校是由学院组成的, 即compostition, 学院是教授的集合地, aggregation

      class Professor;
      
      class Department
      {
       private:
       // Aggregation
       Professor* members[5];
      };
      
      class University
      {
       private:
       std::vector<Department> faculty;
       create_dept() {
      
         // Composition
         faculty.push_back(Department());
         faculty.push_back(Department());
       }
      };
      
      class class1 as "University"
      class class2 as "Department"
      class class3 as "Professor"
      
      class3 -right--o class2
      class2 -right--* class1
      

      https://images0.cnblogs.com/blog/188068/201404/211609543738201.jpg

    2.2.2 添加label

    在关系的后面加个":", 而后添加相应的label, 在连接符两边用""可以添加对应类的label, 如

    Class01 "1" *-- "many" Class02 : contains
    Class03 o-- Class04 : agregation
    

    https://images0.cnblogs.com/blog/188068/201404/211609553103814.jpg

    2.2.3 添加方法

    在类名后面添加":", 如:

    Object <|-- ArrayList
    
    Object : equals(0
    ArrayList : Object[] elementData
    ArrayList : size()
    

    https://images0.cnblogs.com/blog/188068/201404/211609558413186.jpg

    另一种方法为:

    class Dummy {
      String data
      void methods()
    }
    

    https://images0.cnblogs.com/blog/188068/201404/211609563736856.jpg

    在类中添加不同的方法的时候, 往往需要给出相应的方法的属性, 如private, protected, public等:

     
    - private
    # protected
    ~ package private
    + public

    https://images0.cnblogs.com/blog/188068/201404/211609569982499.jpg

    2.2.4 注释以及定型

    对图中的类进行注释, 采用"..", 定型(即, 给类一个特定的分类), 采用""和" ".

    https://images0.cnblogs.com/blog/188068/201404/211609582636013.jpg

    在注释中还可以使用html标签对注释的内容的格式进行美化.

    • <b> 加粗
    • <u> 加下划线
    • <i> 斜体
    • <s>, <del>, <strike> 删除线
    • <font color="#AAAAAA"> or <font color="colorname"> 字体颜色
    • <color:#AAAAAA> or <color:colorName> 字体颜色
    • <size: nn> 字体大小
    • <img src="file"> or <img:file> 添加图片
    note top of Object
      In java, every <u>class</u>
      <b>extends</b>
      <i>this</i> one
    end note
    
    note as N1
      This <size:10>note</size> is <u>also</u>
      <b><color:royalBlue>on several</color></b>
      <s>words</s> lines
    end note
    

    https://images0.cnblogs.com/blog/188068/201404/211609591708869.jpg

    2.2.5 抽象类以及接口

    抽象类使用"abstract"或"abstract class"关键字, 接口用"interface"关键字, 枚举用"enum"关键字

    abstract class AbstractList
    abstract AbstractConllection
    interface List
    interface Collection
    
    List <|-- AbstractList
    Collection <|-- AbstractConllection
    
    Collection <|- List
    AbstractConllection <|- AbstractList
    AbstractList <|- ArrayList
    
    ArrayList : Object[] elementData
    ArrayList : size()
    
    enum TimeUnit
    TimeUnit : DAYS
    TimeUnit : HOURS
    TimeUnit : MINUTES 
    

    https://images0.cnblogs.com/blog/188068/201404/211610001237711.jpg

    2.2.6 方法属性的隐藏

    可以使用 "hide/show" 命令实现对方法以及属性的隐藏, 常用的命令如下:

    • hide empty members
    • hide empty fields or hide empty attributes
    • hide fields or hide attributes
    • hide methods
    • hide members
    • hide circle 隐藏类名前面圆形的字符
    • hide stereotype 通过""和" "增加的标识
    • hide class
    • hide interface
    • hide enum
    • hide foo1 隐藏所有foo1标识的类
    • hide classname
    class Dummy1 {
      +myMethods()
    }
    
    class Dummy2 {
      +hiddenMethod()
    }
    
    class Dummy3 <<tag>> {
      string name
    }
    
    hide members
    hide <<tag>> circle
    show Dummy1 method
    show <<tag>> members
    

    https://images0.cnblogs.com/blog/188068/201404/211610007483353.jpg

    2.2.7 packages

    包的定义可以使用关键词"package"

    package "Classic Collections" #DDDDDD {
      Object <|-- ArrayList
    }
    
    package net.sourceforge.plantuml #Snow {
      Object <|-- Demo1
      Demo1 *- Demo2
    }
    

    https://images0.cnblogs.com/blog/188068/201404/211610014668967.jpg

    包之间的关系也可以通过类似的方式给出:

    package foo1.foo2 {
    }
    
    package foo1.foo2.foo3 {
      class Object
    }
    
    foo1.foo2 +-- foo1.foo2.foo3
    

    https://images0.cnblogs.com/blog/188068/201404/211610024207809.jpg

    2.2.8 命名空间

    引用当前默认命名空间中的类时, 只要在类名前增加一个"."即可.

    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
    

    https://images0.cnblogs.com/blog/188068/201404/211610030299222.jpg

    2.2.9 箭头方向的控制

      <- or -left-> 向左
      -> or -right-> 向右
      <-- or -up-> 向上
      --> or -down-> 向下
    
    foo1 -left-> dummyLeft
    foo1 -right-> dummyRight
    foo1 -up-> dummyUp
    foo1 -down-> dummyDown
    
    foo2 -> right
    left <- foo2
    up <-- foo2
    foo2 --> down
    

    https://images0.cnblogs.com/blog/188068/201404/211610039353079.jpg

    Date: 2014-04-18 Fri

    Author: Zhong Xiewei

    Org version 7.8.11 with Emacs version 24

    Validate XHTML 1.0
  • 相关阅读:
    [leetcode]Remove Nth Node From End of List
    [leetcode]Palindrome Number
    [leetcode]Integer to Roman
    HDU 4709:Herding
    HDU 4708:Rotation Lock Puzzle
    HDU 4707:Pet
    HDU 4706:Children's Day
    SDUT 2411:Pixel density
    SDUT 2413:n a^o7 !
    SDUT 2409:The Best Seat in ACM Contest
  • 原文地址:https://www.cnblogs.com/grass-and-moon/p/3678648.html
Copyright © 2020-2023  润新知