计模式篇(Java):桥接模式

news/2024/4/27 1:43:34/文章来源:https://blog.csdn.net/qq_45408390/article/details/131482879

上一篇:计模式篇(Java):适配器模式

九、桥接模式

需求示例

当我们对不同手机类型的不同品牌实现操作编程,如图:

在这里插入图片描述

那么它对应的类图就是

在这里插入图片描述

传统方式解决需求分析:

  • 扩展性问题,如果需要在增加手机的样式(翻盖),那么我们需要增加每个品牌的种类,如果我们增加一个手机品牌,也需要在每个手机样式下增加。
  • 违反了单一职责原则:当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本。
  • 解决方案:使用桥接模式

9.1 桥接模式基本介绍

  • 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
  • 是一种结构型设计模式
  • Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现 (Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

桥接模式原理图

在这里插入图片描述

分析

  • Cilent类:桥接模式的调用者
  • 抽象类(Abstraction):维护了Implementor / 即它的实现类ConcreteImplementorA/B,二者是聚合关系,其中Abstraction充当桥梁(桥接类)
  • RefinedAbstraction:是Abstraction抽象类的子类
  • Implementor:行为实现类的接口
  • ConcreteImplementorA:行为的具体实现类

9.2 桥接模式解决需求

使用桥接模式对应的类图

在这里插入图片描述

代码实现

品牌接口

/*** @author cVzhanshi* @create 2023-06-27 17:30*/
public interface Brand {void open();void call();void close();
}

品牌接口实现类

@Slf4j
public class Huawei implements Brand{@Overridepublic void open() {log.info("Huawei开机啦");}@Overridepublic void call() {log.info("Huawei打电话啦");}@Overridepublic void close() {log.info("Huawei关机啦");}
}@Slf4j
public class Mi implements Brand{@Overridepublic void open() {log.info("Mi开机啦");}@Overridepublic void call() {log.info("Mi打电话啦");}@Overridepublic void close() {log.info("Mi关机啦");}
}

手机抽象类

/*** @author cVzhanshi* @create 2023-06-27 17:32*/
public abstract class Phone {// 品牌private Brand brand;public Phone(Brand brand) {this.brand = brand;}protected void open(){this.brand.open();}protected void call(){this.brand.call();}protected void close(){this.brand.close();}
}

抽象类的样式子类

/*** @author cVzhanshi* @create 2023-06-27 17:34*/@Slf4j
public class AnJian extends Phone{public AnJian(Brand brand) {super(brand);}@Overrideprotected void open() {super.open();log.info("按键手机");}@Overrideprotected void call() {super.call();log.info("按键手机");}@Overrideprotected void close() {super.close();log.info("按键手机");}
}@Slf4j
public class ChuPin extends Phone{public ChuPin(Brand brand) {super(brand);}@Overrideprotected void open() {super.open();log.info("触屏手机");}@Overrideprotected void call() {super.call();log.info("触屏手机");}@Overrideprotected void close() {super.close();log.info("触屏手机");}
}

客户端调用桥接模式

/*** @author cVzhanshi* @create 2023-06-27 17:37*/@Slf4j
public class Client {public static void main(String[] args) {Phone phone1 = new AnJian(new Mi());phone1.open();phone1.call();phone1.close();log.info("=================================");Phone phone2 = new AnJian(new Huawei());phone2.open();phone2.call();phone2.close();log.info("=================================");Phone phone3 = new ChuPin(new Huawei());phone3.open();phone3.call();phone3.close();}
}// 输出结果
17:40:39.229 [main] INFO cn.cvzhanshi.design.bridge.Mi - Mi开机啦
17:40:39.233 [main] INFO cn.cvzhanshi.design.bridge.AnJian - 按键手机
17:40:39.234 [main] INFO cn.cvzhanshi.design.bridge.Mi - Mi打电话啦
17:40:39.234 [main] INFO cn.cvzhanshi.design.bridge.AnJian - 按键手机
17:40:39.234 [main] INFO cn.cvzhanshi.design.bridge.Mi - Mi关机啦
17:40:39.234 [main] INFO cn.cvzhanshi.design.bridge.AnJian - 按键手机
17:40:39.234 [main] INFO cn.cvzhanshi.design.bridge.Client - =================================
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.Huawei - Huawei开机啦
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.AnJian - 按键手机
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.Huawei - Huawei打电话啦
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.AnJian - 按键手机
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.Huawei - Huawei关机啦
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.AnJian - 按键手机
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.Client - =================================
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.Huawei - Huawei开机啦
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.ChuPin - 触屏手机
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.Huawei - Huawei打电话啦
17:40:39.235 [main] INFO cn.cvzhanshi.design.bridge.ChuPin - 触屏手机
17:40:39.236 [main] INFO cn.cvzhanshi.design.bridge.Huawei - Huawei关机啦
17:40:39.236 [main] INFO cn.cvzhanshi.design.bridge.ChuPin - 触屏手机

分析:如果使用桥接模式完成需求,那么如果要加一个样式,或者加一个品牌只需要添加一个类就行,不需要修改其他的类。

9.3 桥接模式的注意事项和细节

  • 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
  • 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部 分由具体业务来完成。
  • 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
  • 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

应用场景

  • JDBC驱动程序
  • 银行转账系统
    • 转账分类: 网上转账,柜台转账,AMT转账
    • 转账用户类型:普通用户,银卡用户,金卡用户.
  • 消息管理
    • 消息类型:即时消息,延时消息
    • 消息分类:手机短信,邮件消息,QQ消息…

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

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

相关文章

自学网络安全究竟该从何学起?

一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入行…

MATLAB | 拉普拉斯分布/拉普拉斯噪声的生成

一、实验目标 生成拉普拉斯分布的噪声,并分析它的概率密度函数 二、解决思路 (1)拉普拉斯分布可以由指数分布生成 拉普拉斯的概率密度函数为 f ( x ; μ , λ ) 1 2 λ e − ∣ x − μ ∣ λ f(x;\mu,\lambda)\frac{1}{2 \lambda} e^{…

简单的手机记事本怎么把英文翻译成中文?

手机记事本是人们常用的辅助工具之一,在使用手机记事本记录内容的时候,除了我们平时使用较多的中文之外,也有人会记录一些英文内容。想要将手机记事本中的英文内容翻译成中文内容应该如何操作呢?以iPhone手机端敬业签记事本软件为…

GIS杂记(二):Arcgis对采样点进行裁剪,获取指定区域内的采样点

有时候需要对栅格数据进行采样处理,如果采样点过多则会使得采样时间过长,今天在进行数据采样时,使用了1km*1km的渔网建立的采样点,大概有1百万个点,程序运行时间大概4个小时,但是其中有绝大部分数据都是空值…

Css 基础:选择器,三大特性

1.emmet的 快速格式化代码 配置 "editor.formatOnType": true, "editor.formatOnSave": true 2.基础选择器 3.复合选择器 4.单行文本垂直居中原理 5.css背景 6.CSS三大特性 层叠性:相同选择器设置相同样式,发生在样式冲突时&#xf…

【PC】CPU与GPU

文章目录 CPU与主板CPU是什么主板是什么功能 GPU与显卡GPU是什么显卡是什么功能 CPU与GPU的关系 ALU: 算术单元(Arithmetic Unit):算术单元执行基本的算术运算,如加法、减法、乘法和除法。它能够对整数、浮点数和定点数…

Web服务器群集:LVS+Keepalived高可用群集

目录 一、理论 1.Keepalived 2.VRRP协议(虚拟路由冗余协议) 3.部署LVSKeepalived 高可用群集 二、实验 1.LVSKeepalived 高可用群集 三、问题 1.备服务器网卡启动报错 四、总结 一、理论 1.Keepalived (1)简介 Keepal…

Redis高可用群集---搭建(主从、哨兵、Cluster)

目录 Redis 高可用集群Redis 主从复制Redis 哨兵模式Redis 集群模式 Redis 高可用集群 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redi…

MySQL原理探索——22 MySQL有哪些“饮鸩止渴”提高性能的方法

不知道你在实际运维过程中有没有碰到这样的情景:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能。 我做项目的时候,就偶尔会碰上这种场景。用户的开发负责人说,不管…

Spring中bean使用方法

Spring框架是一个非常重要的开发工具,它提供了丰富的功能和模块,其中核心的概念之一就是Spring Bean。Spring Bean是Spring IoC容器中的一个对象,它负责管理一个Java对象的生命周期以及依赖注入。下面我将通过互联网场景下的相关背景内容来阐…

4通道AD采集子卡模块有哪些推荐?

FMC134是一款4通道3.2GSPS(2通道6.4GSPS)采样率12位AD采集FMC子卡模块,该板卡为FMC标准,符合VITA57.4规范,可以作为一个理想的IO模块耦合至FPGA前端,16通道的JESD204B接口通过FMC连接器连接至FPGA的高速串行…

分布式系统监控zabbix安装部署及自定义监控

系列文章目录 文章目录 系列文章目录一、zabbix1.zabbix的基本概述2.zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。3.zabbix 监控原理4.Zabbix 6.0 功能组件5. zabbix的监控对象6.zabbix的常用术语7.zabbix进程详解8.zabbix的监控框…

安装配置云计算模板机

安装虚拟机模板机 一、在VMware上安装Centos虚拟机二、修改虚拟机的ip、网关、DNS三、更换yum源3.1 更换本地yum源3.2 更换国内互联网Yum源 四、 安装net-tools和bash-completion五、 关闭防火墙和SELinux 学习云计算后续需要多个虚拟机,作为云计算集群的节点&#…

【近场社交项目】数据库系统期末设计——需求分析部分

【近场社交项目】数据库系统设计——需求分析😎 前言🙌1.需求求分析(用户部分为例)1.2用户数据字典1.2.1用户信息表(数据结构):数据项间的关系和结构定义: 1.2.2.个人资料表(数据结构…

【React组件通讯的三种方式】

React组件通讯的三种方式 父组件传递数据给子组件子组件传递数据给父组件 React组件之间的通讯分为三种: 父组件 →子组件子组件 →父组件兄弟组件 父组件传递数据给子组件 步骤: 父组件提供要传递的state数据给子组件标签添加属性,值为st…

LeetCode·每日一题·445. 两数相加 II·模拟

作者:小迅 链接:https://leetcode.cn/problems/add-two-numbers-ii/solutions/2328613/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-67qx/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权&#xff…

使用家庭宽带和摄像头,实现公网直播

那天去逛商场看到有个营业厅,本想进去问问有没有存话费送话费的活动,结果被忽悠办了一个19.9升千兆宽带加送一个路由器的业务。 网络环境验证 听他们说现在家庭宽带都是有公网IPV6地址的,立马用电脑试了下确实有IPV6地址。 赶紧随便写了几行…

记录使用ffmpeg把mp4转换成m3u8

背景:公司需要上一些视频资源,平均每一个都在600m以上,经过考虑以后采取视频分片以后上传到oss上进行加速播放的流程.这里记录一下使用ffmpeg进行转换视频格式的过程中的一些命令. 准备工作: 下载ffmpeg到本地,以及配置ffmpeg到环境变量中,这里就不多说了. 使用的时候先打开…

Jenkins之pipeline语法——2023.07

文章目录 一、概述二、Pipeline任务1、Pipeline Script 运行任务2、Pipeline script from SCM 通过代码库运行任务3、在 job(任务)中配置Pipeline script from SCM 三、Jenkinsfile 语法1、脚本式语法2、声明式语法1. agent :节点2. tool3. environment2. stages &a…

ATTCK(六)之ATTCK子项目atomicredteam测试环境安装与使用

ATT&CK子项目atomicredteam测试环境安装与使用 Atomicredteam的主站点为https://atomicredteam.io/,是一个攻击测试库,每个安全团队都可以执行这些测试来测试他们的防御控件。测试是有重点的,几乎没有依赖关系,并且以结构化格…