UML---四种关系在代码中的体现

一、简介

在画类图之前,我们要理清UML中的四中关系,常见的有以下四种关系:泛化(Generalization),  实现(Realization),关联(Association),依赖(Dependency),而在关联中又包括:聚合(Aggregation),组合(Composition)

以下是简单的例子来说明四种关系如何在代码(应用)中体现:

实现接口:大雁实现飞翔

继承:动物和鸟

关联:企鹅和气候

聚合:雁群和大雁

组合:鸟和翅膀

依赖:动物和氧气

二、应用

实现接口:

代码体现:

interface IFlay
{
    void Speak();
}

class WideGoose:IFlay
{}

泛化(继承)

代码体现(以下也体现了多态)

abstract class Animal
{
    public abstract 数据类型 方法名(参数);
}


class Bird:Animal
{
    public override 数据类型 方法名(参数);
}

关联

关联是最弱的关系,只引用了单个对象

代码体现(也有this的情况)

class Penguin:Bird
{
    private Climate climate;
}

聚合

表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分(引用了对象数组---多个或抽象类)

(是一种遍历,将继承父类的子类遍历一遍,可以全部遍历也可以不全部遍历,还可以根据条件不同,调用相应的子类中的代码;代码体现在this.X,关联也会有this,这时候要判断一个还是多个(或父类),一个则是关联,多个或父子类则是聚合)

例一

代码体现

class WideGooseAggregate
{
    private WideGoose[] ArrayWideGoose;
}

例二:

 

public class Waiter
{
    private Command command;

public void SetOrder(Command command)
{
    this.command=command;
}

合成(组合)

是一种强‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样

(是一种生成你就要生成我的关系,体现在一个类X中的构造函数中是否实例化了另一个类Y,如果把Y全部的子类实例化则为合成,如果只生成了Y的一部分,则不为合成,可能是聚合)

代码体现(不仅要引用,还要在构造函数中实例化,使他们之间同时生成)

class Bird
{
    private Wing wing;
    public Bird()
    {
        wing=new wing();
    }
}

依赖

动物要生存就要依赖于氧气和水

例子一:

代码体现(氧气为动物的构造函数中的参数,,没有引用)

abstract Class Animal
{
    public Metabolism(Oxygen oxygen)
    {
    }
}

例二:(返回值的类型为被引用的类的父类)

class SqlServerFactory:IFactory
{
    public IUser CreateUser()
    {   
        return new SqlserverUser()
    }
}

三、小结

关联---引用对象的数量与是否在构造函数中实例化,使用引用的参数

依赖---构造函数中的参数,不是引用的参数,可能是类中本身(this),或是从客户端传进来的参数但是这个方法的数据类型就是指向方向的那个类的类型,或者参数引用的就是指向方向的那个类的类型

泛化(继承)---父与子的关系(:符号)

实现:一种独立功能的实现(:符号)

小技巧:箭头指向的一方是被引用

### UML 类图中的关系及其代码实现 #### 继承 (Inheritance) 继承表示一种 "is-a" 的关系,在 Python 中可以通过 `class` 定义来体现这种父子类之间的关联。 ```python class Animal: def speak(self): pass class Dog(Animal): # Dog is an Animal def speak(self): return "Woof!" ``` 子类可以重写父类的方法并调用其属性[^1]。 #### 聚合 (Aggregation) 聚合是一种弱的 “has-a” 关系,意味着整体对象拥有部分对象但是不控制它们的生命期。这通常通过组合实例变量完成: ```python class Department: def __init__(self, name): self.name = name self.employees = [] class Employee: def __init__(self, id, department=None): self.id = id self.department = department hr_dept = Department('HR') emp1 = Employee(101, hr_dept) print(emp1.department.name) # 输出 'HR' ``` 这里员工可以在创建时被分配给部门,也可以之后再设置所属部门[^2]。 #### 组合 (Composition) 组合也是一种强形式的 “has-a”,它暗示着当容器对象消失时组件也会随之销毁。Python 中可通过初始化参数传递依赖项: ```python from datetime import date class Address: def __init__(self, street, city): self.street = street self.city = city class Person: def __init__(self, name, birth_date, address_info): self.name = name self.birth_date = birth_date self.address = Address(*address_info) person = Person("Alice", date.today(), ("Main St.", "Wonderland")) del person # 当删除Person对象时Address也被自动清理 ``` 此例子展示了地址作为人的组成部分而存在;如果人不存在,则该特定住址也无意义[^3]。 #### 关联 (Association) 两个独立实体之间简单的双向或多向联系称为关联。此类连接可能涉及多个角色或方向上的导航权限。 ```python class Teacher: def teach(self): print(f"{self} teaches.") class Student: teacher = None @classmethod def set_teacher(cls, tchr): cls.teacher = tchr t = Teacher() Student.set_teacher(t) s = Student() if s.teacher: s.teacher.teach() # 可能会打印出教师教课的信息 ``` 在这个场景下,学生和老师相互作用但彼此间并没有所有权的概念[^4]。 #### 依赖 (Dependency) 依赖是指一个类使用另一个类的服务或接口的情况,通常是临时性的交互而不是长期持有对方引用。 ```python def send_email(email_service, recipient, message): email_service.send(recipient=recipient, content=message) class EmailService: def send(self, **kwargs): print(f'Sending "{kwargs["content"]}" to {kwargs["recipient"]}.') email_svc = EmailService() send_email(email_svc, "example@example.com", "Hello!") ``` 函数 `send_email()` 对象仅在其内部短暂地利用到了邮件服务的功能[^5]。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值