一、类的设计
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
学习设计模式的第一步是看懂UML类图,类图能直观的表达类、对象之间的关系,这将有助于后续对代码的编写。
类图在软件设计及应用框架前期设计中是不可缺少的一部分,它的主要成分包括:类名、类方法(成员函数)、成员变量。
部分符号含义如下:
+ :公有成员(Public)
- :私有成员(Private)
# :保护成员(Protected)
下划线 :静态成员(如+staticVar: int)
常见的类之间的关系包括:继承(泛化)、实现、关联、聚合、组合、依赖。根据耦合度由强到弱又分为接口实现关系、继承泛化关系、不可分离组合的关系、可分离组合的关系、关联关系和依赖关系。
文章目录
- 一、类的设计
- 二、关系定义及示例
-
- 1.继承(泛化)
-
- 1.1、示例
- 2.实现
-
- 2.1、示例
- 3.关联
-
- 3.1、示例
- 4.聚合
-
- 4.1、示例
- 5.组合
-
- 5.1、示例
- 5.2、聚合与组合关系的区别
- 6.依赖
-
- 6.1、示例
- 6.2、依赖场景
- 6.3、复杂依赖示例
- 总结
二、关系定义及示例
1.继承(泛化)
语义:子类继承父类的属性和方法(is-a关系)
画法:空心三角形箭头(子类指向父类)
派生类继承基类,基类被看作是“一般设计”,派生类被看作“特殊设计”,继承泛化关系关系也被称为一般与特殊的关系。
1.1、示例
class Animal {
};
class Dog : public Animal {
}; // C++
多重继承如下:
class Bird : public Animal {
public:
void fly() const {
std::cout << "Flying..." << std::endl;
}
};
class Parrot : public Bird {
public:
void speak() const override {
std::cout << "Hello!" << std::endl;
}
};
2.实现
语义:类实现接口的方法
画法:空心三角形+虚线箭头,箭头指向基类
接口实现关系是派生类必须重写接口中所有的方法。
2.1、示例
class Flyable {
virtual void fly() = 0; };
class Bird : public Flyable {
}; // C++
#include <iostream>
#include <vector>
// 接口
class Drawable {
public:
virtual void draw() const = 0;
virtual ~Drawable() = default;
};
// 实现类
class Circle : public Drawable {
public:
void draw() const override {
std::cout << "⚪ Drawing Circle" << std::endl;
}
};
class Rectangle : public Drawable {
public:
void draw() const override {
std::cout << "⬛ Drawing Rectangle" << std::endl;