1.依赖、关联、聚合和组合关系
在实际开发中,将任务需求拆分后下一步就是设计合适的代码框架,在制作代码框架的过程中常常从面向对象的角度将不同需求拆分成不同的类,它们之间主要包括四种常见的依赖
、关联
、聚合
和组合
关系。
1.1 依赖关系
依赖关系主要有以下三种情况:
1、B类使用A类作为参数进行传递或返回A类
public class A
{
}
public class B
{
public void func1(A a) { }
public A func2() { return new A(); }
}
2、A类是B类的局部变量
public class A
{
}
public class B
{
A a = new A();
}
3、A类向B类发送消息,从而影响B类发生变化
class A
{
public event Action Event;
void SendMessageToB()
{
// 向B类发送消息
Event?.Invoke();
}
}
class B
{
public void HandleMessageFromA()
{
// 处理来自A类的消息
}
}
// 使用示例:
A a = new A();
B b = new B();
a.Event += b.HandleMessageFromA;
// 当A类发送消息时,会影响到B类进行特定的处理操作
1.2 关联关系
关联关系是一种强依赖的关系,和依赖关系不同的是,依赖关系是一种临时关系,主要体现在方法参数和消息传递上面,关联关系是一种长期关系,一般作为成员变量出现,不论是否调用这种关系都存在。
1、单向关联:B拥有A,B和A之间为has关系
public class A
{
}
public class B
{
public A a = new A();
}
2、双向关联:A拥有B,B拥有A,B和A之间相互为has关系
public class A
{
public B b = new B();
}
public class B
{
public A a = new A();
}
3、自关联关系,一般单例模式会使用这种关系
public class A
{
public A a = new A();
}
4、多重关联,B类包含多个A类
public class A
{
}
public class B
{
public A[] a;
}
1.3 聚合关系
聚合关系是一种面向对象设计中的关联关系,表示一个对象包含另一个对象时,两者之间的关系。在聚合关系中,被包含的对象可以属于多个聚合体,而且在聚合体销毁时,被包含的对象不会随之销毁。
1、
Course
类包含一个List<Chapter>
对象,表示一个课程包含多个章节。这种关系是聚合关系,因为章节可以属于多个不同的课程,而且在课程销毁时,章节并不会随之销毁。
public class Chapter
{
public string Title { get; set; }
public string Content { get; set; }
}
public class Course
{
public string Name;
public List<Chapter> Chapters { get; set; } = new List<Chapter>();
}
2、聚合关系通常体现为属性,因为其有更好的封装性、可变性和可追踪性。如下面使用属性
PhoneNumbers
来表示Person
类与List<string>
类之间的聚合关系。该属性返回了只读的联系电话列表,阻止调用方修改Person
对象的联系电话列表。这有助于保护Person
对象的内部状态,使其更易于维护和安全。`
public class Person
{
private List<string> _phoneNumbers = new List<string>();
public IReadOnlyCollection<string> PhoneNumbers
{
get { return _phoneNumbers.AsReadOnly(); }
}
public void AddPhoneNumber(string phoneNumber)
{
_phoneNumbers.Add(phoneNumber);
}
}
1.4 组合关系
组合关系是一种强聚合的关系,组合关系与聚合关系的区别在于:聚合关系中部分离开整体仍可存活,组合关系中部分离开整体没有意义。在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。
1、组合关系的例子,
Car
类在构造函数中创建了一个新的Engine
对象,并将其作为成员变量保存。在这种情况下,Engine
对象与Car
对象是紧密耦合的,它们之间不存在独立性。如果汽车对象被销毁,那么发动机对象也会随之被销毁。这种关系可以被称为组合关系,因为两个对象之间是整体与部分的关系。
public class Car
{
private Engine _engine;
public Car()
{
_engine = new Engine();
}
}
public class Engine
{
// 发动机的属性和方法
}
1.4.1 组合关系和聚合关系的区别
总结来说:聚合关系是一种松散的关联,其中部分对象可以独立于整体存在,而组合关系是一种紧密的关联,部分对象无法脱离整体而存在
聚合和组合的区别
// 聚合关系
public class Department
{
private List<Employee> _employees;
public Department(List<Employee> employees)
{
_employees = employees;
}
}
public class Employee
{
// 员工的属性和方法
}
// 组合关系
public class Department
{
private List<Employee> _employees;
public Department()
{
_employees = new List<Employee>();
_employees.Add(new Employee());
_employees.Add(new Employee());
}
}
public class Employee
{
// 员工的属性和方法
}
参考链接
https://zhuanlan.zhihu.com/p/350793664
https://blog.csdn.net/lwwl12/article/details/82463441