【设计模式学习(一)】对象之间的基本关系梳理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值