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

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

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

一、依赖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. }


相关文章
|
6月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
196 16
|
6月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
202 0
|
6月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
189 0
|
6月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
161 0
|
6月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
6月前
|
设计模式 Prometheus 监控
并发设计模式实战系列(20):扇出/扇入模式(Fan-Out/Fan-In)(完结篇)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第二十章,废话不多说直接开始~
220 0
|
10月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
219 40
|
8月前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
10月前
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——工厂方法模式
简单工厂模式是一种创建型设计模式,通过一个工厂类根据传入参数创建不同类型的产品对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。适用于创建对象种类较少且调用者无需关心创建细节的场景。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。
153 15
|
10月前
|
设计模式 Java
「全网最细 + 实战源码案例」设计模式——生成器模式
生成器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象。它允许用户通过控制对象构造的过程,定制对象的组成部分,而无需直接实例化细节。该模式特别适合构建具有多种配置的复杂对象。其结构包括抽象建造者、具体建造者、指挥者和产品角色。适用于需要创建复杂对象且对象由多个部分组成、构造过程需对外隐藏或分离表示与构造的场景。优点在于更好的控制、代码复用和解耦性;缺点是增加复杂性和不适合简单对象。实现时需定义建造者接口、具体建造者类、指挥者类及产品类。链式调用是常见应用方式之一。
161 12

热门文章

最新文章