1.依赖关系
依赖关系是 UML 类图中一种相对较弱的关系,用于表明一个类在某种程度上依赖于另一个类来完成特定任务。当类 A 的某个方法使用了类 B 的对象作为参数、局部变量,或是调用了类 B 的静态方法时,就存在类 A 对类 B 的依赖关系。这种关系通常是临时性的,仅在类 A 执行特定操作时才会关联到类 B。
- 特点:
- 临时性:依赖关系不像关联、聚合、组合那样表示类之间长期稳定的结构联系,它只是方法执行期间的短暂关联。
- 单向或双向:可以是单向的,即 A 依赖 B 但 B 不依赖 A;也可能是双向的,不过较为少见,意味着双方的方法互相有所依赖。
- 松散耦合:依赖关系下的两个类耦合度较低,被依赖类的变动对依赖类的影响范围通常局限于使用到的具体方法。
- 使用对象作为参数产生依赖
在这段代码中,ReportWriter
类依赖于Printer
类。ReportWriter
类的generateReport
方法需要借助Printer
类的printText
方法来输出报告内容,Printer
类的对象作为参数传入,一旦generateReport
方法执行完毕,这种依赖联系在本次操作中就结束了。class Printer { public: void printText(const std::string& text) { std::cout << text << std::endl; } }; class ReportWriter { public: void generateReport(Printer& printer) { std::string report = "This is a sample report"; printer.printText(report); } };
- 使用局部变量引发依赖
MathStudent
类的doHomework
方法依赖Calculator
类。在doHomework
方法内部,创建了Calculator
类的局部变量calc
,并使用它的add
方法完成计算,计算完成后,calc
的生命周期结束,此次依赖关系也随之结束。class Calculator { public: int add(int a, int b) { return a + b; } }; class MathStudent { public: void doHomework() { Calculator calc; int result = calc.add(3, 4); std::cout << "The result of calculation is: " << result << std::endl; } };
- 调用静态方法形成依赖
Programmer
类的writeCode
方法依赖Logger
类。通过调用Logger
类的静态方法logMessage
,Programmer
类实现了记录日志的功能,这同样是一种依赖关系,而且由于调用静态方法,甚至不需要创建Logger
类的实例。class Logger { public: static void logMessage(const std::string& msg) { std::cout << "Log: " << msg << std::endl; } }; class Programmer { public: void writeCode() { Logger::logMessage("Writing some code..."); } };
2.泛化关系
泛化关系(Generalization)在 UML 类图里体现的是一种继承关系,它遵循 “is-a” 原则,也就是子类是父类的一种特殊形式。通过泛化,子类能够继承父类的属性和方法,同时还能添加自身独有的属性与方法,实现代码复用与功能扩展。
- 特点:
- 代码复用:父类定义了通用的属性与行为,子类无需重复编写,直接继承即可使用,节省开发精力。例如,若多个子类都需要某个共有的基础方法,在父类中定义一次就行。
- 层次结构:构建起清晰的类层次体系,便于组织和管理复杂的类关系。比如在图形绘制系统中,各种具体图形类从通用的 “图形” 父类派生,逻辑清晰。
- 多态支持:结合虚函数机制,子类能重写父类方法,让程序运行时基于对象实际类型来动态调用合适的方法,增强程序灵活性。
// 定义父类:动物类Animal class Animal { public: std::string name; Animal(const std::string& n) : name(n) {} virtual void makeSound() { std::cout << name << " makes a sound" << std::endl; } }; // 定义子类:狗类Dog,继承自Animal类 class Dog : public Animal { public: Dog(const std::string& n) : Animal(n) {} void makeSound() override { std::cout << name << " barks" << std::endl; } }; // 定义子类:猫类Cat,继承自Animal类 class Ca