设计模式中的关系

文章目录

    • 一、依赖
      • 概念
    • 二,关联
      • 概念
    • 三、聚合
      • 概念
    • 四、组合
      • 概念
    • 五、实现
      • 概念
    • 六、继承
      • 概念
  • 图总结
  • 整体总结

一、依赖

概念

依赖是一种临时使用关系,代码层体现为作为参数。

具体体现:依赖者调用被依赖者的局部变量、参数、静态方法;

例子:人类(Human)的生存(live)依赖于食物(Food)

UML类图

代码实现

public class Human{public void live(Food food){food.eat();}
}
class Food{public void eat(){System.out.println("吃东西");}
}

二,关联

概念

关联是一个对象使用另一对象或与另一对象进行交互的关系。可以是双向,也可以是单向。

关联可视为一种特殊类型的依赖,即一个对象总是拥有访问与其交互的对象的权限,而简单的依赖关系并不会在对象间建立永久性的联系。

具体体现:关联的对象作为一个对象的成员变量

UML类图

在这里插入图片描述

代码实现

public class Human{private Food food;public void live(){food.eat();}
}
class Food{public void eat(){System.out.println("吃东西");}
}

三、聚合

概念

聚合是一种特殊的关联,表示整体对象拥有部分对象,整体和部分生命周期没有必然联系,聚合关系代码层体现也是通过成员变量来体现

聚合是一种特殊类型的关联,用于表示多个对象之间的“一对多”、“多对多”或“整体对部分”的关系。通常在聚合关系中,一个对象“拥有”一组其他对象,并扮演着容器或集合的角色。

UML类图:

在这里插入图片描述

具体体现:被聚合对象作为成员变量

例子:人体主要是由水、血液和肌肉聚合成的

代码实现:

public class Human{private Blood blood;private Water water;private Muscles muscles;public void body(Blood blood,Water water,Muscles muscles){this.blood=blood;this.water=water;this.muscles=muscles;}
}
class Blood{}
class Water{}
class Muscles{}

四、组合

概念

比聚合更强的关联关系;组合是一种特殊类型的聚合,其中一个对象由一个或多个其他对象实例构成。组合与其他关系的区别在于组件仅能作为容器的一部分存在。

具体体现:个体对象作为成员变量

例子: 人和人的心脏、大脑

UML类图

在这里插入图片描述

代码实现

public class Human {private Brain brain;private Heart heart;private String status;public void sustainLife() {brain.control(status);heart.beat(status);}public Human(Brain brain, Heart heart, String status) {this.brain = brain;this.heart = heart;this.status = status;}
}class Brain {public void control(String status) {if (status.equals("0")) {System.out.println("脑死亡");} else {System.out.println("大脑控制身体");}}
}class Heart {public void beat(String status) {if (status.equals("0")) {System.out.println("心跳停止");} else {System.out.println("心脏跳动");}}
}

五、实现

概念

实现,定义一个合约,另一个实体履行合约,实现了一个接口。implements

例子: 引擎,有汽车的引擎,有卡车的引擎

UML类图

在这里插入图片描述

代码实现:

interface Functionality{void engines();
}class Cars implements Functionality{@Overridepublic void engines() {System.out.println("汽车的引擎");}
}class Trucks implements Functionality{@Overridepublic void engines() {System.out.println("卡车的引擎");	}
}

六、继承

概念

继承,子类和父类之间的关系,用于代码扩展,extends。

例子:动物类,包含猫和狗,动物类定义功能,猫狗也各自定义自己的功能

UML类图

代码实现:

abstract class Animal {abstract void functionality();
}
class Cat extends Animal {@Overridevoid functionality() {System.out.println("猫的功能是上树");}
}class Dog extends Animal {@Overridevoid functionality() {System.out.println("狗的功能是力气大");}
}

图总结

在这里插入图片描述

  • 依赖:对类 B 进行修改会影响到类 A 。
  • 关联:对象 A 知道对象 B。类 A 依赖于类 B。
  • 聚合:对象 A 知道对象 B 且由 B 构成。类 A 依赖于类 B。
  • 组合:对象 A 知道对象 B、由 B 构成而且管理着 B 的生命周期。类 A 依赖于类 B。
  • 实现:类 A 定义的方法由接口 B 声明。对象 A 可被视为对象B。类 A 依赖于类 B。
  • 继承: 类 A 继承类 B 的接口和实现, 但是可以对其进行扩展。对象 A 可被视为对象 B。类 A 依赖于类 B。

整体总结

一、依赖是一种临时使用关系,代码层体现为作为参数。

二、关联是结构关系,表示两个对象相联系。代码层体现为作为成员变量使用,即属性。

三、聚合是一种特殊的关联,表示整体对象拥有部分对象,整体和部分生命周期没有必然联系,聚合关系代码层体现也是通过成员变量来体现

四、组合,整体和部分生命周期是一致的(实心菱形),也是通过类的成员变量来实现。

五、实现,定义一个合约,另一个实体履行合约,实现了一个接口。

六、继承,子类和父类之间的关系,用于代码扩展,extends。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker项目实战

目录 1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 1)拉取mysql:5.6和owncloud镜像 2)后台运行容器 3)通过ip:端口的方式访问owncloud 2、安装搭建私有仓库 Harbor 1)首先准备所需包 2)安装h…

Lua与C++交互(一)————堆栈

Lua与C交互(一)————堆栈 Lua虚拟机 什么是Lua虚拟机 Lua本身是用C语言实现的,它是跨平台语言,得益于它本身的Lua虚拟机。 虚拟机相对于物理机,借助于操作系统对物理机器(CPU等硬件)的一…

HTML番外篇(四)-HTML5新增元素-CSS常见函数-理解浏览器前缀-BFC

一、HTML5新增元素 1.HTML5语义化元素 在HMTL5之前,我们的网站分布层级通常包括哪些部分呢? header、nav、main、footer ◼ 但是这样做有一个弊端: 我们往往过多的使用div, 通过id或class来区分元素;对于浏览器来说这些元素不…

雅思作文复习

目录 我使用的词汇: 上升: 下降: 波动: 保持: 幅度 大变化: 小变化: 雅思评价标准改变 小作文一般花费20分钟,我觉得自己能在18分钟解决是最好 考生在雅思考试中的小作文&a…

嵌入式系统存储体系

一、存储系统概述 主要分为三种:高速缓存(cache)、主存和外存。 二、高速缓存Cache 高速缓冲存储器中存放的是当前使用得最多得程序代码和数据,即主存中部分内容的副本,其本身无自己的地址空间。在嵌入式系统中Cac…

别在说自己不知道docker了,全文通俗易懂的给你说明白docker的基础与底层原理

docker介绍 Docker 是一个开源的应用容器引擎,基于Go语言进行开发实现并遵从Apache2.0 协议开源,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作…

Redis.conf详解

Redis.conf详解 配置文件unit单位对大小写不敏感 包含 网络 bind 127.0.0.1 # 绑定的ip protected-mode yes # 保护模式 port 6379 # 端口设置通用 GENERAL daemonize yes # 以守护进程的方式运行 默认为no pidfile /var/run/redis_6379.pid #如果以后台的方式运行&#xff…

python+django+mysql旅游景点推荐系统-前后端分离(源码+文档)

系统主要采用Python开发技术和MySQL数据库开发技术以及基于OpenCV的图像识别。系统主要包括系统首页、个人中心、用户管理、景点信息管理、景点类型管理、景点门票管理、在线反馈、系统管理等功能,从而实现智能化的旅游景点推荐方式,提高旅游景点推荐的效…

javaee idea创建maven项目,使用el和jstl

如果使用el表达式出现下图问题 解决办法 这是因为maven创建项目时&#xff0c;web.xml头部声明默认是2.3&#xff0c;这个默认jsp关闭el表达式 办法1 在每个需要用到el和jstl的页面的上面加一句: <% page isELIgnored"false" %> 方法2 修改web.xml文件开…

睿思BI旗舰版V5.3正式发布

发布时间&#xff1a;2023-7-20 主要更新内容: 1.增加3D地图功能 2.增加水球图 3.增加扇形图&#xff0c;在数据大屏 - 自定义组件中定义。 4.增加指标引导线功能&#xff0c;在数据大屏 - 自定义组件中定义。 5.详情页增加回调函数功能。 6.大屏/仪表盘模版下载&#xff0c;…

【C++】C++ 引用详解 ⑨ ( 常量引用初始化 | C / C++ 常量分配内存的四种情况 )

文章目录 一、常量引用初始化1、使用 " 普通变量 " 初始化 " 常量引用 "2、使用 " 常量 / 字面量 " 初始化 " 常量引用 "3、C / C 常量分配内存的四种情况4、代码示例 - 常量引用初始化 一、常量引用初始化 1、使用 " 普通变量 &…

<八> objectARX开发:动态拖动Jig创建自定义实体

1、介绍 接上一篇文章,在某些情况下,CAD中的实体对象初始参数并不是固定的,我们需要通过jig动态拖动方式来绘制自定义实体,下面就用一个简单的例子来介绍一下自定义实体动态绘制。   实体形状:包括实体夹点和文字夹点拖动实现。 2、效果 3、源码 static void RYMyGrou…

嵌入式linux之QT交叉编译环境搭建(最简单实测通用版)

这里总结下用于嵌入式linux下的QT交叉编译环境搭建&#xff0c;留作备忘&#xff0c;分享给有需要的小伙伴。不管你的是什么嵌入式linux环境&#xff0c;实测过的通用方法总结。 环境准备 需要准备的环境要求如下&#xff1a; 1.虚拟机(vmvare15.5) 2.ubuntu18.04-x64的linu…

【C语言】探讨蕴藏在表达式求解中的因素

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将探讨 操作符 和 类型转换 对表达式求解的影响。 目录&#xff1a; 隐式类型转换算术转换操作符的属性❤️ 结语 隐…

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27

CSDN每日一练 |『异或和』『生命进化书』『熊孩子拜访』2023-08-27 一、题目名称&#xff1a;异或和二、题目名称&#xff1a;生命进化书三、题目名称&#xff1a;熊孩子拜访 一、题目名称&#xff1a;异或和 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述&…

C++:list使用以及模拟实现

list使用以及模拟实现 list介绍list常用接口1.构造2.迭代器3.容量4.访问数据5.增删查改6.迭代器失效 list模拟实现1.迭代器的实现2.完整代码 list介绍 list是一个类模板&#xff0c;加<类型>实例化才是具体的类。list是可以在任意位置进行插入和删除的序列式容器。list的…

Python序列类型

序列&#xff08;Sequence&#xff09;是有顺序的数据列&#xff0c;Python 有三种基本序列类型&#xff1a;list, tuple 和 range 对象&#xff0c;序列&#xff08;Sequence&#xff09;是有顺序的数据列&#xff0c;二进制数据&#xff08;bytes&#xff09; 和 文本字符串&…

Android BatteryManager的使用及BatteryService源码分析

当需要监控系统电量时&#xff0c;用 BatteryManager 来实现。 参考官网 监控电池电量和充电状态 获取电池信息 通过监听 Intent.ACTION_BATTERY_CHANGED 广播实现&#xff0c;在广播接收器中获取电池信息。 这是个粘性广播&#xff0c;即使过了广播发出的时间点后再注册广…

从零起步:学习数据结构的完整路径

文章目录 1. 基础概念和前置知识2. 线性数据结构3. 栈和队列4. 树结构5. 图结构6. 散列表和哈希表7. 高级数据结构8. 复杂性分析和算法设计9. 实践和项目10. 继续学习和深入11. 学习资源12. 练习和实践 &#x1f389;欢迎来到数据结构学习专栏~从零起步&#xff1a;学习数据结构…

Java实现根据短连接获取1688商品详情数据,1688淘口令接口,1688API接口封装方法

要通过1688的API获取商品详情数据&#xff0c;您可以使用1688开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过1688开放平台API获取商品详情属性数据接口&#xff1a; 首先&#xff0c;确保您已注册成为1688开放平台的开发者&#xf…