UML类图的六大关系:依赖,泛化,实现,关联,聚合,组合

1.依赖关系

依赖关系是 UML 类图中一种相对较弱的关系,用于表明一个类在某种程度上依赖于另一个类来完成特定任务。当类 A 的某个方法使用了类 B 的对象作为参数、局部变量,或是调用了类 B 的静态方法时,就存在类 A 对类 B 的依赖关系。这种关系通常是临时性的,仅在类 A 执行特定操作时才会关联到类 B。

  • 特点
    • 临时性:依赖关系不像关联、聚合、组合那样表示类之间长期稳定的结构联系,它只是方法执行期间的短暂关联。
    • 单向或双向:可以是单向的,即 A 依赖 B 但 B 不依赖 A;也可能是双向的,不过较为少见,意味着双方的方法互相有所依赖。
    • 松散耦合:依赖关系下的两个类耦合度较低,被依赖类的变动对依赖类的影响范围通常局限于使用到的具体方法。
  1. 使用对象作为参数产生依赖
    在这段代码中,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);
        }
    };
  2. 使用局部变量引发依赖
    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;
        }
    };
  3. 调用静态方法形成依赖
    Programmer类的writeCode方法依赖Logger类。通过调用Logger类的静态方法logMessageProgrammer类实现了记录日志的功能,这同样是一种依赖关系,而且由于调用静态方法,甚至不需要创建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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值