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

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

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

一、依赖VS关联

依赖

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

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

可描述为:Uses a

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

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

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

1. abstract class Animal
2. {
3. public Metabolism(Oxygen oxygen,Water water)
4.     {
5. 
6.     }
7. }

关联

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

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

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

单向关联:

双向关联:

可描述为:Has a

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

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

代码对应:成员变量

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

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

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

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

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

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

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

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

二、聚合VS组合

聚合

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

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

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

代码对应:成员变量

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

组合

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

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

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

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

代码对应:成员变量

1. class Bird
2. {
3. private Wing wing;
4. public Bird()
5.     {
6.         wing = new Wing();//在鸟Bird类中,初始化时,实例化翅膀Wing,它们之间同时生成
7.     }
8. }

总结:聚合和组合的区别

1、构造函数不同

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

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

2、信息的封装性不同

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

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

三、继承VS实现

继承

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

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

可描述为:Is a

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

代码对应:

1. class Bird : Animal //鸟类继承动物类
2. {
3. 
4. }

实现

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

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

代码对应:

1. class WideGoose :IFly //实现飞翔接口
2. {
3. 
4. }


相关文章
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
17天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
16 3
|
2月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
2月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
19天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
31 0
|
2月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
3月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
3月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)