设计模式中的六种关系以及代码之间的对应

强弱关系:依赖<关联<聚合<组合<实现<继承

一、依赖battle关联

依赖

定义

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。就好比动物依赖氧气和水。

类图

image.png

图形:箭头+虚线

代码关系

abstract class Animal
{
    public Metabolism (Oxygen oxygen,Water water)
    {}
}

关联

定义

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。关联关系分为单向关联,和双向关联。单项关联:A类中使用了B类,其中类B类作为A类的成员变量。双向关联:A类当中使用了B类作为成员变量;同时类B中也使用了类A作为成员变量。当一个类知道另一个类时可以用关联。就好比企鹅需要知道气候的变化。

类图

image.png

图形:箭头+实线

代码关系

class Penguin :Bird
{
    private Climate climate;//在企鹅Penguin中,引用到气候Climate对象
 }

总结

依赖和关联之间的关系是什么?

  1. 从类的属性是否增加的角度看
  • 发生依赖关系的两个类都不会增加属性。其中一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已
  • 发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。
  1. 从关系的生命期角度看
  • 依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。
  • 关联关系是当类实例化的时候即产生,当类销毁时关系结束。相比依赖讲,关联关系生存期更长。

二、聚合battel组合

聚合

定义

聚合关系是关联关系的一种,耦合度强于关联,他们的代码是相同的,在语义上有所区别:关联关系的对象是相互独立的,而据和关系的对象之间存在包容关系,具有整体-个体的关系。这种关系体现在A对象可以包含B对象,但B对象不是A对象的一部分。

类图

image.png

图形:空心菱形+实线箭头

代码关系

class WideGooseAggregate
{
    private Goose goose;
    public WideGooseAggregate(Goose goose)
    {
        this.goose=goose;
    }
}

组合

定义

组合关系表示整体-部分的关联关系,体现了严格的部分和整体的关系,部分和整体的生命周期是一样的。部分和整体密不可分

类图

image.png

图形:实心菱形+实线箭头

代码关系

class Bird
{
    private Wing wing;
    public Bird()
    {
        wing=new wing();//在鸟Bird类中,初始化时,实例化翅膀Wing,他们之间同时生成
    }
}

总结

他们之间的区别

  1. 构造函数不同
  • 聚合类的构造函数包含了另一个类作为参数,雁群类的构造函数要用到大雁(Goose)作为参数传递进来,大雁类(Goose)可以脱离雁群独立存在。
  • 组合类的构造函数中包含了另一个类的实例化。表明大雁类在实例化之前一定要先实例化翅膀类(WIngs),这两个类紧密的耦合在一起,同生共灭。翅膀类是不可以脱离大雁类(Goose)而独立存在。
  1. 信息的封装性不同
  • 在聚合关系中,客户端可以同时谅解雁群类和大雁类,因为他们都是独立存在的
  • 在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中三

三、继承battel实现

继承

定义

继承表示类与类 类与接口之间的关系表示父子关系(鸟 兔子 都是动物,继承动物)

类图

image.png

图形:实线+空心箭头

代码关系

class Bird:Animal
{}

实现

抽象出的共同的方法

类图

图形:虚线+空心箭头

image.png

代码关系

class WideGoose :Ifly{}//实现飞翔的接口

猜你喜欢

转载自blog.csdn.net/wangwei021933/article/details/112963910