【大话设计模式】设计模式的六种关系

目录

一、依赖VS关联

依赖

关联

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

1、从类的属性是否添加的角度看

2、从关系的生命期角度看

二、聚合VS组合

聚合

组合

总结:聚合和组合的区别

扫描二维码关注公众号,回复: 13296484 查看本文章

1、构造函数不同

2、信息的封装性不同

三、继承VS实现

继承

实现


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

一、依赖VS关联

依赖

定义:是一种使用的关系,即一个类的实现需要另一个类的协助.。就好比动物依赖氧气和水

图形:虚线+箭头,指向被使用者

image.png

可描述为:Uses a

依赖是类的六种关系中耦合最小的一种关系

在生成代码的时候,这两个关系类都不会增加属性

代码对应:方法参数、方法中的局部变量、静态方法调用

image

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

关联

定义:是一种拥有的关系,它使一个类知道另一个类的属性和方法。比如企鹅需要知道气候的变化

关联可以是双向关联,也可以是单向关联。双向关联可以有两个箭头或者没有箭头,单向关联有一个箭头

图形:实线+箭头,指向被拥有者

单向关联:

image.png

双向关联:

image.png

可描述为:Has a

关联关系用实线,表示类之间的耦合度比依赖强

在生成代码的时候,关联关系的类会增加属性

代码对应:成员变量

image

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

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

1、从类的属性是否添加的角度看

(1)发生依赖关系的两个类都不会增加属性,其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已

(2)发生关联关系的两个类,其中一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系

2、从关系的生命期角度看

(1)依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束

(2)关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长

二、聚合VS组合

聚合

定义:是整体与部分的关系,且部分可以离开整体而单独存在,体现的是A对象可以包含B对象,但B对象不是A对象的一部分, 就好比大雁离开了雁群

图形:空心的菱形+实线箭头,菱形指向整体

image.png

类之间的耦合关系比组合弱

代码对应:成员变量

image

class WideGoseAggregate
{
	private WideGoose[] arrayWideGoose;//在雁群WideGooseAggregate类中,有大雁数组对象arrayWideGoose    
}

组合

定义:是整体与部分的关系,但部分不能离开整体而单独存在,比如鸟有两只翅膀,如果两只翅膀离开了鸟的话,翅膀就没有作用了

图形:实心的菱形+实线箭头,菱形指向整体

image.png

组合关系的练习两端还有一个数字‘1’和数字‘2’,这被称为基数。表名这一端的类可以有几个实例。如果一个类可以有无数个实例,那就用‘n’来表示

类之间的耦合关系比聚合强

代码对应:成员变量

image

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

总结:聚合和组合的区别

1、构造函数不同

聚合类的构造函数中包含了另一个类作为参数。雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数传递进来。大雁类(Goose)可以脱离雁群类而独立存在

组合类的构造函数中包含了另一个类的实例化。表明大雁类在实例化之前,一定要先实例化翅膀类(Wings),这两个类紧密的耦合在一起,同生共灭。翅膀类(Wings)是不可以脱离大雁类(Goose)而独立存在

2、信息的封装性不同

在聚合关系中,客户端可以同时了解雁群类和大雁类,因为它们都是独立的

在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中

三、继承VS实现

继承

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

图形:空心三角形+实线,箭头指向父类

image.png

可描述为:Is a

泛化也称继承,子类将继承父类的所有属性和方法,并且可以根据需要对父类进行拓展

代码对应:

image

class Bird : Animal //鸟类继承动物类
{
	
}

实现

定义:是一种类与接口的关系,表示类是接口所有特征和行为的实现

图形:带三角箭头的虚线,箭头指向接口

image.png

代码对应:

image

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

猜你喜欢

转载自blog.csdn.net/weixin_45490023/article/details/119379712