设计模式——合成复用原则

2023-11-01

合成复用原则

原则是尽量使用合成/聚合的方式,而不是使用继承

设计原则核心思想

  1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
  2. 针对接口编程,而不是针对实现编程。
  3. 为了交互对象之间的松耦合设计而努力

合成案例

假设我们有一个汽车类(Car),其中包含引擎类(Engine)。下面是使用合成的代码描述:

https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/principle/composite/Demo1.java

在上面的代码中,我在汽车类中添加了一个静态的main方法。在main方法中,我创建了一辆汽车对象,并指定了引擎类型为"V8"。然后,我调用了汽车对象的启动方法和停止方法,以展示汽车的功能。

您可以运行这个Java程序,看到在控制台输出的结果,显示汽车的启动和停止过程。
这个示例展示了如何在汽车类中使用合成关系,将引擎对象组合到汽车中,并通过main方法来演示汽车的使用

聚合案例

https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/principle/composite/Demo2.java

在上面的代码中,学校类(School)使用聚合关系,将学生对象(Student)聚合到学校中。学校类通过添加学生对象到学生列表中,并提供了显示学生的方法。

学生类(Student)是一个简单的类,表示学生。它有一个姓名属性和获取姓名的方法。
通过使用聚合关系,我们可以实现学校类的代码复用和灵活性。学校类通过聚合学生对象来管理学生。这种设计方式避免了继承关系的局限性,使系统更加灵活和可维护。

在main方法中,我创建了一个学校对象,并创建了几个学生对象。然后,我将学生对象添加到学校中,并调用学校对象的显示学生方法,以展示学校中的学生信息。

这个示例展示了如何在学校类中使用聚合关系,将学生对象聚合到学校中,并通过main方法来演示学校的学生管理。

继承案例

https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/principle/composite/Test.java

在上面的代码中,Animal 类是一个基类,它有一个私有的 name 属性和一个 makeSound 方法。Dog 类和 Cat 类都继承自 Animal 类,并重写了 makeSound 方法,以实现各自的特定声音。

在 main 方法中,我们创建了一个 Dog 对象和一个 Cat 对象,并将它们赋值给 Animal 类型的变量。然后,我们调用这些对象的 makeSound 方法,分别输出狗的吠声和猫的喵声。

这个示例展示了如何使用继承来创建一个动物类的继承体系。通过继承,我们可以在派生类中重用基类的属性和方法,并根据需要进行定制化。继承提供了代码的复用和扩展性,但也需要注意继承关系的合理使用,避免过度继承和耦合。

优缺点

与继承关系相比,合成复用原则具有以下优点:

  • 更加灵活:通过合成或聚合关系,可以在运行时动态地改变对象的行为,而不需要修改代码。
  • 降低耦合性:合成或聚合关系可以减少类之间的依赖关系,降低耦合性,使系统更加灵活和可维护。
  • 更好的代码复用:通过合成或聚合关系,可以将现有的类组合在一起,创建新的类来实现代码的复用,避免了继承关系的局限性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式——合成复用原则 的相关文章

  • LoadRunner解决动态验证码问题

    对于这个问题 通常我们可以采取以下三个途径来解决该问题 1 第一种方法 也是最容易想到的 在被测系统中暂时屏蔽验证功能 也就是说 临时修改应用 无论用户输入的是什么验证码 都认为是正确的 这种方法最容易实现 对测试结果也不会有太大的影响 当

随机推荐

  • Linux命令之sync

    概述 sync 命令可以强制将内存中的文件缓冲写入磁盘 更新块信息 在 linux unix 系统中 在文件或数据处理过程中一般先放到内存缓冲区中 等到适当的时候再写入磁盘 以提高系统的运行效率 这样虽然可以提高磁盘写入数据的效率 但是也带
  • STM32高级定时器中心对齐PWM模式,频率设置的分享

    有关STM32高级定时器中心对齐PWM输出的实验记录 计算PWM的频率公式 f PCLK2 TIM Prescaler 1 TIM Period 1 2 条件TIM ClockDivision 0 而不是f PCLK2 TIM Presca
  • 单链表的定义,插入与删除,查找,建立。

    链表分为 单链表 双链表 循环链表 静态链表 一 单链表的定义 在内存空间中 各个节点在逻辑上相邻 但在物理上不相邻 在单个的结点内部需要存放 数据域 和 指针域 存放指向下一个结点的指针 优点 不要求一大片连续空间 改变容量方便 缺点 不
  • InVideo AI:用人工智能轻松制作视频

    简介 InVideo AI 是一款在线视频制作工具 使用人工智能来帮助用户快速 轻松地制作高质量的视频 该工具提供多种功能 包括 链接 ai invideo io 仪表盘 历史记录 创建视频 选择模板 youtube explainer 加
  • 关于华硕飞行堡垒8笔记本网卡启动不了(Inter(R) Wi-Fi 6 AX201)该设备无法启动 代码10

    今天打开笔记本莫名奇妙的 连不上WIFI了 网线可以联网 查看设备管理器 网卡亮感叹号 查看详情 提示 该设备无法启动 代码10 代码10有三个情况 1 驱动不合 概率少 2 系统不合 小概率 3 坏了 大概率 解决方案也就是 1 重装网卡
  • proc文件系统下各参数解析

    文章目录 一 proc文件系统 1 1 proc pid 1 1 1 proc pid arch status 1 1 2 proc pid attr 1 1 2 1 proc pid attr current 1 1 2 2 proc p
  • 【华为OD机试真题2023B卷 JS】比赛的冠亚季军

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 比赛的冠亚季军 知识点数组编程基础链表分治 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 有N 3 lt N lt 10000 个运动员 他们的id为0到N 1 他们
  • 如何使用pandas读取csv文件中的某一列数据

    使用pandas读取csv文件中的某一列数据 可以这样做 先导入pandas模块 import pandas as pd 使用pd read csv函数读取csv文件 df pd read csv 文件名 csv 使用df 列名 读取某一列
  • 矩阵的转置(c++)

    将一个m n的二维数组的行和列元素互换 如下图所示 注 T代表转置 输入格式 输入矩阵的行和列数 用空格隔开 接下来输入矩阵的数据 1
  • Tomcat debug模式启动

    在 CATALINA HOME bin startup bat中添加以下任意一行配置 SET JAVA OPTS Xdebug Xrunjdwp transport dt socket address 8787 server y suspe
  • gitlab第一次上传项目

    1 git config global user name git的name 2 git config global user email git的邮箱 3 ssh keygen t rsa C git的邮箱 三次回车 会生成一个id rs
  • .torrent文件如何使用

    遇到 torrent文件 我们需要对应的下载软件 以迅雷为例打开后点击 新建 添加链接或口令 添加BT任务 选中已有 torrent文件即可下载 百度网盘的离线下载也可以进行 torrent文件的下载
  • C语言入门第十九篇,文件操作

    文件操作是通过c语言编程实现对文本文件的控制 比如读入文件内容 处理文件内容等等 相信很多学校的学生在学习的时候老师就会叫大家用c语言做一个学生的成绩管理系统或者是什么的系统 如果不涉及到数据库 那多半是用文件来做 我们这篇主要讲文件的读出
  • Python基础 - os.walk()详细使用

    Python os walk 详细使用 转自 Python os walk 详细使用 小菠萝测试笔记的博客 CSDN博客 os walk 方法简单介绍 主要用来遍历一个目录内各个子目录和子文件 是一个简单易用的文件 目录遍历器 可以帮助我们
  • 手动配置DHCP服务

    目录 一 安装DHCP服务 编辑 二 更改网卡配置 配置网卡信息 3 配置ensp SW2配置 SW1配置 一 安装DHCP服务 进入 进入dhcp的配置文件中进行配置 vim etc dhcp dhcpd conf 这里面是空文件 但是会
  • QT day 1

    作业 widget cpp include window h include
  • Python(1)生成目录及超链接

    Python 1 生成目录及超链接 coding utf 8 import xlsxwriter 导入模块 import os 新建txt文档 f open PCL bat a f write echo off f write ntree
  • 【C语言】函数栈帧的创建和销毁

    目录 1 函数栈帧的含义 概念 要用到的汇编语言的知识 示例 2 理解栈帧 2 1 main函数栈帧的创建 2 2 局部变量的创建 2 3 函数传参 2 4 调用函数 2 5 函数返回 一个 c文件在调用函数的时候 包括main 函数 其内
  • 会议OA项目进度(一)

    目录 前言 一 原型图业务介绍 数据库表结构 二 编码 发布会议 前言 前面的分享告一段落 从本篇文章开始将开始一个比较简易的会议OA系统 为什么要开发OA会议管理 会议是公司日常管理的重要手段之一 为了更好的协调部门与部门之间 员工与员工
  • 设计模式——合成复用原则

    文章目录 合成复用原则 设计原则核心思想 合成案例 聚合案例 继承案例 优缺点 合成复用原则 原则是尽量使用合成 聚合的方式 而不是使用继承 设计原则核心思想 找出应用中可能需要变化之处 把它们独立出来 不要和那些不需要变化的代码混在一起