拓冰建站拓冰建站
首页 / 资讯中心 / 正文

23种设计模式精解:从入门到实战(四)UML类的画法

UML 类图入门从单个类到类间关系什么是 UML 类图UMLUnified Modeling Language统一建模语言类图用于描述系统中包含的类以及它们之间的相互关系帮助简化对系统的理解。它是系统分析和设计阶段的重要产物也是编码和测试的重要模型依据。类图主要包含两部分内容如何通过 UML 描述单个类的结构如何清晰表述类与类之间的关系单个类的画法三层结构UML 中一个类用矩形表示分为三层上层类名中层属性成员变量下层方法成员函数属性表示法格式【可见性】【属性名称】【类型】 {缺省值}可见性符号表示 public#表示 protected-表示 private静态成员属性名下方加下划线方法表示法格式【可见性】【方法名称】(【参数名参数类型】)【返回值类型】多个参数用逗号分隔无返回值使用void静态方法同样加下划线示例猎人类以一个猎人Hunter类为例UML 类图如下---------------------------------- | Hunter | ---------------------------------- | - m_age : int | | - n_times : static int | ---------------------------------- | Hunter(age : int) | | display() : void | | hunt() : void | | getHunterCount() : static int| ----------------------------------对应的 C 实现#include iostream using namespace std; class Hunter { private: int m_age; // 非静态成员变量属于对象 static int n_times; // 静态成员变量属于类 public: Hunter(int age) : m_age(age) { n_times; } static int getHunterCount() { // 静态成员函数只能访问静态成员 return n_times; } void display() const { cout 猎人年龄 m_age endl; cout 猎人总数 n_times endl; } void hunt() { cout 猎人正在狩猎... endl; } }; int Hunter::n_times 0; // 静态成员变量类外初始化 int main() { Hunter h1(25); Hunter h2(30); h1.display(); cout 猎人总数 Hunter::getHunterCount() endl; h1.hunt(); return 0; }关键点对照m_age是每个猎人独有的非静态n_times是所有猎人共享的计数静态UML 中下划线标注。抽象类的表示抽象类特征包含纯虚函数函数声明后加 0UML 中类名使用斜体或标注abstract不能实例化对象示例Animal 抽象类---------------------------------- | abstract | | Animal | ---------------------------------- | # name : string | ---------------------------------- | Animal(name : string) | | makeSound() : void 0 | | display() : void | ---------------------------------- △ | | ---------------------------------- | Dog | ---------------------------------- | - breed : string | ---------------------------------- | Dog(name, breed : string) | | makeSound() : void | | getBreed() : string | ----------------------------------Animal是抽象类makeSound为纯虚函数Dog继承并实现了纯虚函数因此可以实例化。对应的 C 实现#include iostream #include string using namespace std; class Animal { // 抽象类 protected: string name; public: Animal(string n) : name(n) {} virtual void makeSound() const 0; // 纯虚函数 virtual void display() const { cout 动物名称 name endl; } virtual ~Animal() {} }; class Dog : public Animal { // 具体类 private: string breed; public: Dog(string n, string b) : Animal(n), breed(b) {} void makeSound() const override { cout name 品种 breed 在叫汪汪汪 endl; } void display() const override { cout 狗 - 名称 name 品种 breed endl; } }; int main() { // Animal a(动物); // 错误抽象类不能实例化 Dog dog(小白, 金毛); Animal* animal dog; // 父类指针指向子类对象 animal-display(); animal-makeSound(); return 0; }类之间的六种关系单个类的画法只是基础类图真正的价值在于描述类与类之间的关系。常见的有六种关联Association类之间的结构化引用关系一个类的对象持有另一个类的对象作为成员。表示法实线箭头A -- B示例猎人持有猎枪Hunter类中包含Gun类型的成员变量Hunter ---------- Gun依赖Dependency一个类在某个地方使用了另一个类如函数参数、局部变量是最弱的关系。表示法虚线箭头A .. B示例猎人的hunt()方法接收Forest类型的参数Hunter .. Forest泛化Generalization即继承关系子类继承父类的属性和行为。表示法空心三角实线箭头指向父类子类 --| 父类示例Dog继承AnimalDog --| Animal实现Realization类实现接口抽象类中定义的纯虚函数。表示法空心三角虚线箭头子类 ..| 接口示例Dog实现Animal接口的makeSound()Dog ..| Animal在 C 中泛化和实现通常都通过继承体现继承有具体实现的父类是泛化继承只有纯虚函数的抽象类是实现。聚合Aggregation整体与部分的关系但部分可以脱离整体独立存在。表示法空心菱形 实线菱形在整体端整体 o-- 部分示例战队包含队员队员离开战队后仍然存在Team o-- Member组合Composition整体与部分的关系但部分不能脱离整体独立存在生命周期由整体管理。表示法实心菱形 实线菱形在整体端整体 *-- 部分示例汽车包含发动机发动机离开汽车没有独立意义Car *-- Engine六种关系速查表关系表示法强度典型场景关联A -- B中类成员引用另一个类依赖A .. B弱函数参数、局部变量泛化子类 – 父类强实现类 … 接口强聚合整体 o-- 部分中整体-部分部分可独立组合整体 *-- 部分强整体-部分部分不可独立完整示例用一个简单的系统把上面的关系串起来Team o-- Hunter (聚合战队包含猎人猎人可独立存在) Hunter -- Gun (关联猎人持有猎枪) Hunter .. Forest (依赖狩猎方法接收森林参数) Hunter --| Person (泛化猎人继承自人) Dog ..| Animal (实现狗实现动物接口) Car *-- Engine (组合汽车包含发动机不可独立)这张图涵盖了六种关系阅读时从箭头和菱形的形状就能判断关系类型。小结UML 类图的学习分两步掌握单个类的画法三层结构、属性/方法表示法、可见性符号、静态成员和抽象类的特殊标注理解类间六种关系关联、依赖、泛化、实现、聚合、组合每种关系对应不同的箭头或菱形符号画类图时先识别系统中有哪些类再确定类之间的关系最后用标准符号表达。熟练之后类图能帮你在写代码之前就把系统结构想清楚减少后期重构的代价。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门