组合模式+桥接模式

news/2024/5/17 20:53:55/文章来源:https://blog.csdn.net/weixin_57128596/article/details/127285811

目录

组合模式

定义:

业务实现例子:

桥接模式 

JDBC中的桥接模式


 

组合模式

定义:

对象组合通过树形结构进行展示,使得用户——>不管对单个对象or组合对象的使用具有一致性

可以理解为部分-整体模式——>简单来说就是树的递归回溯

角色介绍:

Component:一个业务构件,为我们leaf叶子节点和Composite容器对象声明接口

leaf:叶子节点,实现管理构件的方法

Composite:容器对象,包含叶子节点,可以递归调用子节点的业务方法

在这里插入图片描述

 

业务实现例子:

比如多个部门,每个部门下面又有子部门,我们需要统计部门人员的总薪资,这时候我们可以用组合模式的思想进行统计(是一个树状,对树进行遍历统计)

在这里插入图片描述

 部门包含子部门和员工,这是一种嵌套结构,可以表示成树这种数据结构。计算每个部分的薪资开支这样一个需求,可以通过在树上的遍历算法来实现。所以,从这个角度来看,这个应用场景可以使用组合模式来设计和实现

类介绍:

HumanResource部门类(Department)员工类(Employee)抽象出来的父类,为的是能统一薪资的处理逻辑(递归得子钱,一步步返回得大钱)。Demo 中的代码负责从数据库中读取数据并在内存中构建组织架构图

public abstract class HumanResource {protected long id;protected double salary;public HumanResource(long id) {this.id = id;}public long getId() {return id;}public abstract double calculateSalary();
}public class Employee extends HumanResource {public Employee(long id, double salary) {super(id);this.salary = salary;}@Overridepublic double calculateSalary() {return salary;}
}
public class Department extends HumanResource {private List<HumanResource> subNodes = new ArrayList<>();public Department(long id) {super(id);}@Overridepublic double calculateSalary() {double totalSalary = 0;for (HumanResource hr : subNodes) {totalSalary += hr.calculateSalary();}this.salary = totalSalary;return totalSalary;}public void addSubNode(HumanResource hr) {subNodes.add(hr);}
}// 构建组织架构的代码
public class Demo {private static final long ORGANIZATION_ROOT_ID = 1001;private DepartmentRepo departmentRepo; // 依赖注入private EmployeeRepo employeeRepo; // 依赖注入public void buildOrganization() {Department rootDepartment = new Department(ORGANIZATION_ROOT_ID);buildOrganization(rootDepartment);}private void buildOrganization(Department department) {List<Long> subDepartmentIds = departmentRepo.getSubDepartmentIds(departmentfor (Long subDepartmentId : subDepartmentIds) {Department subDepartment = new Department(subDepartmentId);department.addSubNode(subDepartment);buildOrganization(subDepartment);}List<Long> employeeIds = employeeRepo.getDepartmentEmployeeIds(department.gfor (Long employeeId : employeeIds) {double salary = employeeRepo.getEmployeeSalary(employeeId);department.addSubNode(new Employee(employeeId, salary));}}
}

桥接模式 

场景: 当有两个类:糖水燕窝和其他的燕窝种类,然后销售方式有两种,那么如果我们继承的花,每加一个类就会造成指数型的增长(你可以想象为一个二维数组,如果+一个销售渠道和一个燕窝类型就变为3x3)

模式优点
(1)实现了抽象和实现部分的分离

桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。

(2)可动态的切换实现
由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。

(3)更好的可扩展性
由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。(4)实现细节对客户端透明,可以对用户隐藏实现细节
 

桥接模式进行优化

本质就是将抽象和实现进行解耦,创建一个连接类,实现功能类的组合,而不再是继承,减少了创建类的开销——>x变为+

代码实现案例

参考这位的

(40条消息) 桥接模式(Bridge Pattern)-(最通俗易懂的案例)_你上来晒太阳的的博客-CSDN博客_桥接模式

ColorAPI :用于画各种颜色的接口

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public interface ColorAPI {public void paint();
}

BlueColorAPI :画蓝色的实现类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class BlueColorAPI implements ColorAPI {@Overridepublic void paint() {System.out.println("画上蓝色");}
}

RedColorAPI :画红色的实现类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class RedColorAPI implements ColorAPI
{@Overridepublic void paint() {System.out.println("画上红色");}
}

Shape :抽象形状类

我们通过客户端给形状注入客户想要的颜色(setColor),draw方法在后面的形状子类也会进行重写——>本质是调用颜色的paint()方法

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public abstract class Shape {protected ColorAPI colorAPI;    //添加一个颜色的成员变量以调用ColorAPI 的方法来实现给不同的形状上色public void setDrawAPI(ColorAPI colorAPI) {      //注入颜色成员变量this.colorAPI= colorAPI;}public abstract void draw();        
}

Circle :圆形类

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Circle extends Shape {@Overridepublic void draw() {System.out.print("我是圆形");colorAPI.paint();}
}
/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Rectangle extends Shape {@Overridepublic void draw() {System.out.print("我是长方形");colorAPI.paint();}
}

client客户端:set客户想要的颜色进行组合

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Client {public static void main(String[] args) {//创建一个圆形Shape shape = new Circle();//给圆形蓝色的颜料shape.setDrawAPI(new BlueColorAPI());//上色shape.draw();//创建一个长方形Shape shape1 = new Rectangle();//给长方形红色的颜料shape1.setDrawAPI(new RedColorAPI());//上色shape1.draw();}
}

添加一个新的类三角形,就只需要添加一个三角形类即可

/*** Created on 2020/3/18* Package com.design_pattern.bridge** @author dsy*/
public class Triangle extends Shape {@Overridepublic void draw() {System.out.println("我是三角形");colorAPI.paint();}
}

JDBC中的桥接模式

 

MySQL 的 Connection 接口实现的是 java.sql.Connection 接口,同时 Oracle 数据库也一样可以实现 java.sql.Connection 接口,他们向下都可以有更多的实现子类。

然后 DriverManager 相当于桥接模块(类似于上面的Shape基类),聚合 java.sql.Connection 接口,供客户端调用。

和我们上面所说有点不同,就是 DriverManager 不是抽象类,而是直接的具体实现。

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

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

相关文章

深度学习环境搭建

(1) 安装 Anaconda :建立 Python 应用环境 安装成功界面如下:(2) Visual Studio Code: 建立代码编辑环境 1.安装Python扩展2.选择合适的Python解释器 3.安装下列应用扩展:codeRunner : 快速运行程序 Jupyter : 交互式运行程序 Pylance : 高效代码提示 安装完成如图所示:4.创…

Linux基础组件之muduo日志库分析

muduo日志库分析异步日志机制双缓存机制前台日志写入栈后台日志(落盘)写入栈使用示例总结后言异步日志机制 #mermaid-svg-nrIugWYiOaAGFTWH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nrIugWYiOaAGFTWH .error-…

如何做架构规划

文章目录架构师的职责WhyWhatHow架构活动生命周期环境搭建目标确认可行性探索架构规划统一语义需求确认任务边界划分确认规划完整性项目启动阶段性价值交付复盘经历过的典型案例参考架构师的职责 Why 互联网架构活动的挑战较多&#xff0c;如&#xff1a; 反射式的研发行为。…

Scratch软件编程等级考试四级——20200913

Scratch软件编程等级考试四级——20200913理论单选题判断题实操奇偶之和创意画图数字之和用逗号分隔列表数字反转理论 单选题 1、执行下面程序&#xff0c;输入4和7后&#xff0c;角色说出的内容是&#xff1f;&#xff08;&#xff09; A、4&#xff0c;7 B、7,7 C、7,4 D、…

为什么会发生云中断?如何防范?

IT 越依赖云服务&#xff0c;用户就越有可能因云中断而遭受停机和收入损失。由于云中断事件的发生&#xff0c;超过 60% 的使用公共云的组织在 2022 年报告了损失&#xff0c;因此云中断并不是公司不太可能面临的异常事件。 但是中断是否足以成为永远离开云的理由?还是应该坚持…

《安富莱嵌入式周报》第286期:8bit浮点数规范,VxWorks火星探测器故障原因修复,Matter V1.0智能家居规范,Wireshark 4.0发布

往期周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 目录 视频版&#xff1a; 1、SIA全球半导体行业协会统计显示全球芯片市场增长放缓&#xff0c;中国市场下跌10% …

程序员如何高效准备简历和面试03:诊断:简历为什么被忽视?

你好&#xff0c;欢迎学习课时3&#xff0c;我是你的职场导师吴文娟。 这节课主要为后面教你写简历做个铺垫&#xff0c;学习内容只有2个字&#xff1a;挑错。一个大家比较喜欢的事。我们来敲黑板看一些反面典型&#xff0c;案例都是我截取之前诊断过的简历&#xff0c;讲一讲为…

Mac电脑图片后期处理Lightroom Classic 2022(lrc2022)

Lightroom Classic 2022具有非常强大的图像处理功能&#xff0c;甚至对照片的一些修饰也可以完成&#xff0c;例如去除不要的物体、校正照片和增强照片颜色等。Lightroom Classic 2022 Mac版为用户提供了各种满足优秀摄影效果所需的编辑工具。让您能够轻松提亮颜色、使灰暗的摄…

C++ Builder XE TChart动态添加N个线条TLineSeries变化

// LARGE_INTEGER litmp; LONGLONG QPart1,QPart2; double dfMinus, dfFreq, dfTim; QueryPerformanceFrequency(&litmp); dfFreq (double)litmp.QuadPart;// 获得计数器的时钟频率 QueryPerformanceCounter(&litmp)…

STM32:外部中断控制旋转编码器并计次

1.主函数(main.c)代码部分&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Encoder.h" int16_t Num; int main(void) { OLED_Init(); OLED_Sh…

第十四届蓝桥杯备赛模板题——蓝桥部队 (带权并查集)

目录1.蓝桥部队1. 问题描述2.输入格式3.输入样例4.样例答案5.原题连接2.解题思路3.Ac_code1.蓝桥部队 1. 问题描述 小明是蓝桥部队的长官&#xff0c;他的班上有 NNN 名军人和 111 名军师。 这天&#xff0c;NNN 名军人在操场上站成一排&#xff0c;起初编号为 iii 的军人站…

JPA EntityManager 获取关联对象

今天尝试了几种方式&#xff0c;来获取关联对象。 关联对象&#xff0c;使用的 OneToMany(fetchFetchType.EAGER) 下面给一下总结&#xff1a; 一 Example 毫无疑问&#xff0c;很有信心&#xff0c;Example可以关联到对象。 事实也是这样。 但是Example好像只有and关系…

公众号网课题库系统-轻易获取查题接口

公众号网课题库系统-轻易获取查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击…

Mindquantum实现变分量子奇异值分解

论文题目&#xff1a;Variational Quantum Singular Value Deposition(VQSVD) 项目介绍 复现过程 案例1&#xff1a;分解随机生成的8*8复数矩阵 先引入需要使用的包&#xff1a; import os os.environ[OMP_NUM_THREADS] 1​ import mindspore as ms from mindquantum impo…

Transformer解读之:Transformer 中的 Attention 机制

encoder 的 attention 场景&#xff1a;现在要训练的内容是 I love my dog -> 我喜欢我的狗那么在 encoder 端的输入是&#xff1a; I love my dog&#xff1b;假设经过 embedding 和位置编码后&#xff0c;I love my dog 这句话肯定已经变成了一个向量&#xff0c;但是在这…

一文彻底搞清Linux中块设备驱动的深层次原理和编写方法

【摘要】本文主要讲述了在Linux环境下的块设备驱动的常见数据结构和内核接口&#xff0c;并以一个实际例子讲述了块设备驱动的编写方法。 1.前提知识 一个块驱动提供对块存储设备&#xff08;比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机械硬盘、固态硬盘等&…

Bed Bath Beyond EDI 856提前发货通知

自从1971年创业以来&#xff0c;Bed Bath&Beyond&#xff08;以下简称为BBB&#xff09;一直在为用户提供货真价实的卫浴用品&#xff0c;床上用品等家用商品。Bed Bath&Beyond 致力于成为一个勇于承担责任的公司团体&#xff0c;在市场建立起良好的信誉&#xff0c;提…

JavaSE 案例练习——精算师 double精度丢失解决思路

案例介绍 具体的内容是这样的&#xff1a; 编写一个程序&#xff0c;提示输入一个代表总钱数的双精度值&#xff0c;然后确定每种纸币和硬币需要的最少数量以达到输入的总钱数。 假设人民币种类如下&#xff1a;佰圆纸钞&#xff0c;伍拾圆纸钞&#xff0c;贰拾圆纸钞&#…

Asible最佳实践-进阶版-RHCA447 定义分组与变量

Asible最佳实践-进阶版-RHCA447 -------定义角组变量/主机变量/变量文件6.1 所有受管节点设置sudo免密[root@libin libin]# vim /etc/sudoers.d/devops libin ALL=(ALL) NOPASSWD:ALL [root@libin sudoers.d]# scp devops 192.168.124.134:`pwd` 6.2 自定义ansible目录[root@l…

学习使用jquery控制select下拉选项的字体样式

学习使用jquery控制select下拉选项的字体样式实现代码实现代码 <script src"../jquery-2.1.4.min.js"></script><style>div#container {padding: 30px;font-family: verdana, lucida;}a {color: #777;display: block;background-color: #ccc;widt…