桥接模式(合成/聚合复用原则)

桥接模式

文章目录

  • 桥接模式
    • 合成/聚合复用原则
    • 桥接模式
    • 通过示例了解桥接模式

合成/聚合复用原则

合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承

合成(Composition),也有翻译成组合)和**聚合(Aggregation)**都是关联的特殊种类。聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分:合成则是一种强的拥有关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。比方说,大雁有两个翅膀,翅膀与大雁是部分和整体的关系,并且它们的生命周期是相同的,于是大雁和翅膀就是合成关系。而大雁是群居动物,所以每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以大雁和雁群是聚合关系。

合成聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物

桥接模式

桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化

通过示例了解桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立地进行变化。在桥接模式中,抽象部分和实现部分通过继承或组合实现解耦,形成两个独立的等级结构,然后通过一个关联关系(桥)将它们连接起来。

以下是一个简单的Java桥接模式示例,以图形绘制为例,抽象部分是形状(Shape),实现部分是颜色(Color),桥接部分是将形状和颜色关联起来:

抽象部分,形状接口

// 抽象部分:形状接口
public interface Shape {void draw(Color color);
}

实现部分:颜色接口

public interface Color {void applyColor();
}

具体实现部分:具体颜色

public class Red implements Color {@Overridepublic void applyColor() {System.out.println("Applying red color");}
}
public class Blue implements Color {@Overridepublic void applyColor() {System.out.println("Applying blue color");}
}

桥接部分:具体形状

public abstract class AbstractShape implements Shape {protected Color color;public AbstractShape(Color color) {this.color = color;}@Overridepublic abstract void draw(Color color);
}

具体形状类:圆形

public class Circle extends AbstractShape {public Circle(Color color) {super(color);}@Overridepublic void draw(Color color) {System.out.println("Drawing a circle with color");color.applyColor();}
}

具体形状类:正方形

public class Square extends AbstractShape {public Square(Color color) {super(color);}@Overridepublic void draw(Color color) {System.out.println("Drawing a square with color");color.applyColor();}
}

主程序

public class BridgePatternDemo {public static void main(String[] args) {Shape circle = new Circle(new Red());circle.draw(circle.getColor());Shape square = new Square(new Blue());square.draw(square.getColor());}
}
  1. Shape是抽象部分,定义了形状的绘制方法,但不关心具体颜色。
  2. Color是实现部分,提供了不同的颜色应用方法。
  3. AbstractShape是桥接部分,它持有Color对象,并实现了Shape接口,将形状和颜色关联起来。
  4. Circle和Square是具体的形状,它们扩展了AbstractShape,并提供了自己的绘制逻辑。
  5. ain方法展示了如何使用桥接模式,创建不同形状和颜色的组合。

通过桥接模式,我们可以独立地增加新的形状和颜色,而不需要修改原有代码,符合开闭原则。同时,它也降低了系统的复杂度,提高了可维护性。

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

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

相关文章

ThingsBoard版本控制配合Gitee实现版本控制

1、概述 2、架构 3、导出设置 4、仓库 5、同步策略 6、扩展 7、案例 7.1、首先需要在Giitee上创建对应同步到仓库地址 ​7.2、giit仓库只能在租户层面进行配置 7.3、 配置完成后:检查访问权限。显示已成功验证仓库访问!表示配置成功 7.4、添加设…

”数组指针变量与函数指针变量“宝典

大家好呀,我又来啦!最近我很高效对不对,嘿嘿,被我自己厉害到了。 这一节的内容还是关于指针的,比上一期稍微有点难,加油!!! 点赞收藏加关注,追番永远不迷路…

AI大事记(持续更新)

文章目录 前言 一、人工智能AI 1.基本概念 2.相关领域 2.1基础设施 2.2大模型 2.3大模型应用 二、大事记 2024年 2024-05-14 GPT-4o发布 2024-02-15 Sora发布 2023年 2023-03-14 GPT-4.0发布 2022年 2022-11-30 ChatGPT发布 总结 前言 2022年11月30日openai的…

从零开始学习Linux(6)----进程控制

1.环境变量 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,我们在编写C/C代码时,链接时我们不知道我们链接的动态静态库在哪里,但可以连接成功,原因是环境变量帮助编译器进行查找,环境变量通常具有…

QT中C端关闭导致S端崩溃问题

在实现多线程C/S通信时,有一个bug卡了我好久——当有一个C端关闭时,S端会崩溃。 经过一条条函数语句的筛查,终于找到问题出在哪里: 我通过类QList和迭代器来存储、访问C端链接的socket,而我在deleteSocket中delete迭…

【农业期刊】转基因作物的利弊分析

摘要概述1 转基因作物的优越性1.1 被修饰生物体的基因的遗传具有稳定性1.2 减少除草剂和农药用量1.3 资源可再生,符合可持续发展观念1.4 改生存环境、增产增收解决人类温饱问题 2 转基因作物的带来的不利影响2.1 影响农业种植制度2.2 转基因技术带来的基因污染2.2.1…

【爬虫之scrapy框架——尚硅谷(学习笔记two)--爬取电影天堂(基本步骤)】

爬虫之scrapy框架--爬取电影天堂——解释多页爬取函数编写逻辑 (1)爬虫文件创建(2)检查网址是否正确(3)检查反爬(3.1) 简写输出语句,检查是否反爬(3.2&#x…

Codeforces Round 920 (Div. 3) D. Very Different Array (贪心)

Petya 有一个由 n n n 个整数组成的数组 a i a_i ai​ 。他的弟弟 Vasya 很羡慕,决定自己也做一个 n n n 个整数的数组。 为此,他找到了 m m m 个整数 b i ( m ≥ n ) b_i ( m≥n ) bi​(m≥n),现在他想从中选择一些 n n n 个整数并按…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷,网络是复杂的,需要建立复杂电力系统的同一潮流数学模型,借助计算机进行求解。 简介 …

免费Premiere模板,几何图形元素动画视频幻灯片模板素材下载

Premiere Pro模板,几何图形元素动画视频幻灯片模板 ,组织良好,易于自定义。包括PDF教程。 项目特点: 使用Adobe Premiere Pro 2021及以上版本。 19201080全高清。 不需要插件。 包括帮助视频。 免费下载:https://prmu…

Fabric实现多GPU运行

官方的将pytorch转换为fabric简单分为五个步骤: 步骤 1: 在训练代码的开头创建 Fabric 对象 from lightning.fabric import Fabricfabric Fabric() 步骤 2: 如果打算使用多个设备(例如多 GPU),就调用…

NIO使用NIO传输图片

相比于传统的阻塞IO,NIO提供了一种更灵活和高效的 I/O 操作方式,NIO 提供的非阻塞式的 I/O 操作,使得一个单独的线程可以管理多个通道(Channel),从而更好地处理并发连接和大量的 I/O 操作。 1. 核心组件 …

高级个人主页

高级个人主页 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, use…

ESP32重要库示例详解(四):获取NTP时间之time库

在物联网项目中&#xff0c;时间同步和管理是至关重要的功能之一&#xff0c;特别是在需要执行定时任务或记录事件时间戳的场景下。Arduino平台通过其内置的<time.h>库提供了强大的时间处理能力&#xff0c;使得开发者能够方便地与网络时间协议&#xff08;NTP&#xff0…

PDF文件转换为CAD的方法

有时候我们收到一个PDF格式的设计图纸&#xff0c;但还需要进行编辑或修改时&#xff0c;就必须先将PDF文件转换回CAD格式。分享两个将PDF转换回CAD的方法&#xff0c;一个用到在线网站&#xff0c;一个用到PC软件&#xff0c;大家根据情况选择就可以了。 ☞在线CAD网站转换 …

css超出部分省略(单行、多行,多种方法实现)

HTML <p class"text">这是一行测试数据,这是一行测试数据,这是二行测试数据,这是一行测试数据,这是三行测试数据,这是四行测试数据</p>1.单行 .text{width: 200px;border: 1px solid #000000;white-space: nowrap; /* 控制元素不换行 */overflow: hi…

单链表与双链表

实现一个单链表,链表初始为空,支持三种操作: 向链表头插入一个数;删除第 k 个插入的数后面的一个数;在第 𝑘 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数…

fuel无人机自主探索代码解读1——map_ros.cpp【地图ros接口】

一、概述 map_ros.cpp订阅深度图/雷达点云、世界坐标下传感器pose&#xff0c;每0.05s启动esdf地图更新&#xff0c;每0.05s进行全局地图和局部地图可视化。主要功能为&#xff1a;接受传感器数据、调用sdf_map.cpp文件内部膨胀地图及esdf地图更新接口、地图可视化等。涉及传感…

Python笔记:比较运算符

比较运算符也叫关系运算符。 Python的比较运算符及用法&#xff1a; 比较运算符描述写法等于x y!不等于x ! y>大于x > y<小于x < y>大于等于x > y<小于等于x < y 1、比较运算符会返回布尔类型的结果。&#xff08;True / False&#xff09; num1 …

数电发票、全电发票为什么不是连号的?Node.js发票查验接口集成

全电发票号码为全国统一赋码&#xff0c;采用的是20位发票号码&#xff0c;其实是连续的。只是在实际开票过程中&#xff0c;不止一位纳税人在开&#xff0c;有其他纳税人也在开&#xff0c;所以会出现对某一个纳税人来说号码没有连续的情况。那么&#xff0c;全电发票如何进行…