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

news2024/9/24 9:28:10

上一篇:计模式篇(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{
    @Override
    public void open() {
        log.info("Huawei开机啦");
    }

    @Override
    public void call() {
        log.info("Huawei打电话啦");
    }

    @Override
    public void close() {
        log.info("Huawei关机啦");
    }
}


@Slf4j
public class Mi implements Brand{
    @Override
    public void open() {
        log.info("Mi开机啦");
    }

    @Override
    public void call() {
        log.info("Mi打电话啦");
    }

    @Override
    public 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);
    }

    @Override
    protected void open() {
        super.open();
        log.info("按键手机");
    }

    @Override
    protected void call() {
        super.call();
        log.info("按键手机");
    }

    @Override
    protected void close() {
        super.close();
        log.info("按键手机");
    }
}


@Slf4j
public class ChuPin extends Phone{
    public ChuPin(Brand brand) {
        super(brand);
    }

    @Override
    protected void open() {
        super.open();
        log.info("触屏手机");
    }

    @Override
    protected void call() {
        super.call();
        log.info("触屏手机");
    }

    @Override
    protected 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.coloradmin.cn/o/713261.html

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

相关文章

什么是业务逻辑攻击 (BLA),大家为什么一定要要关注它?

想象一下:您的开发团队刚推出了一款令人惊叹的全新应用程序,它具有顶级的API安全性,通过客户端保护对其进行了强化,甚至还设置了针对机器人攻击的防御措施。你感到这款产品很有安全保障,自己的团队出色地完成了工作。 …

SAP从入门到放弃系列之生产执行-领用与消耗概述

文章目录导航 一、生产物资领用1.1、概述1.2、项目中自开发领料功能方式一:创建预留的方式方式二:创建UB订单方式 二、生产投料 一、生产物资领用 1.1、概述 生产的备料方式因为企业的行业特点以及企业对材料库存管理的流程设置,企业使用的…

MATLAB | 高斯变量概率密度函数的理论与实际对比

一、仿真实验目的 生成一组高斯变量,并基于生成的数据统计其概率密度函数,与理论高斯概率密度函数进行对比,观察生成的高斯变量的概率分布。 二、解决思路 (1)利用randn函数生成高斯随机变量 (2&#xf…

利用Visual Studio 2022 导出目标dll API接口

利用Visual Studio 2022 导出目标dll API接口 操作路径: 指令如下: dumpbin /exports /out:C:\\Users\\Administrator\\Desktop\\PlantSimCore.txt C:\\Users\\Administrator\\Desktop\\PlantSimCore.dll dumpbin /exports /out:C:\\Users\\Administrator\\Desktop\\

Ubuntu18.04安装Qt5.14.2

一、安装 第一步: 官网Index of /archive/qt 下载安装包, 或者国内网址下载 https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.0/ 我安装的是QT5.14.2 中的 qt-opensource-linux-x64-5.14.2.run ; 第二步:ctrlT 打开终端输入命…

Python的Logging模块

1.日志的相关概念🍃 日志是指记录系统或应用程序运行状态、事件和错误信息的文件或数据。在计算机系统中,日志通常用于故障排除、性能分析、安全审计等方面。日志可以记录各种信息,如系统启动和关闭时间、应用程序的运行状态、用户登录和操作…

数字化就是做系统?广州数字化转型服务公司推荐

数字化转型是一个与数字化技术密切相关的概念,很多不了解数字化转型的企业往往会认为数字化转型就是提升企业的数字化技术应用水平和不断增加数字化系统的功能,也就是将数字化转型认为是做系统。但实际上,开利网络认为,数字化转型…

使用vtk在一个窗口中创建多个几何体

引言 该示例为官网上的例子。在一个窗口中创建了多个不同的几何体。 其效果如下: 示例 开发环境 使用QtCreator4.11.2,Qt5.14.2。使用的vtk9.2的库及其头文件。创建空项目。 示例代码 其pro文件中的内容: QT core#greaterThan(QT_MAJOR_V…

【产品文档】埋点需求文档模板

今天和大家免费分享埋点需求文档模板。埋点文档的目的是帮助开发人员准确地实施埋点,并确保收集到的数据符合预期,以便后续分析和改进产品。 【模板下载】 这个模板可以在 Axure高保真原型哦 小程序里免费下载哦 【文档截图】

微搭低代码实现横向滚动效果

目录 1 添加滚动容器2 滚动内容设置总结 在小程序场景中,有很多横向滚动的效果,比如我们的官方模板电商展示里就有一个横向滚动的效果,本篇我们解读一下横向滚动该如何实现 1 添加滚动容器 不管是横向滚动还是纵向滚动,我们都是依…

【Python】NLP参数控制模板

前言 学过AI的都知道训练一个模型需要调整很多参数,为了有效的管理这些参数、不至于让代码的参数写的乱七八糟,有必要写一套控制参数的模板。 argparser argparser是python当中的参数解析器,在NLP当中主要是用来接受和使用参数的。一个使用它…

Word技巧【自用】

表格断开 做到类似这样的效果,很简单,用边框刷就可以 设定边框的横线,以及磅值,就可以像画三线表一样断开了

vue el-dialog嵌入video实现视频播放功能

video嵌入dialog实现视频播放 业务需求1、实现的效果图3、全部代码(复制粘贴即可实现) 业务需求 弹窗实现视频播放&#xff0c;并且切换不同选项卡播放不同视频 1、实现的效果图 3、全部代码(复制粘贴即可实现) <template><el-button style"margin-left: 60px&q…

警惕: 新的 “RustBucket “恶意软件变种针对macOS用户

研究人员已经揭开了苹果macOS恶意软件RustBucket更新版本的序幕&#xff0c;该版本具有改进的能力&#xff0c;可以建立持久性并避免被安全软件发现。 安全实验室的研究人员在本周发表的一份报告中表示&#xff1a;RustBucket的变种是一个针对macOS系统的恶意软件集合&#xf…

Cisco ISR 1000 Series IOS XE Release Dublin-17.11.1a ED

Cisco ISR 1000 Series IOS XE Release Dublin-17.11.1a ED 思科 1000 系列集成多业务路由器 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-1000/&#xff0c;查看最新版。原创<品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 思科 1000…

关于NISP,收藏这个就够了!

01 全面认知NISP 什么是NISP证书&#xff1f; 为提高各领域人才信息安全意识&#xff0c;落实国家信息安全人才培养战略&#xff0c;缓解我国信息安全领域专业人才存在的供需矛盾&#xff0c;加快我国信息安全专业人才队伍的建设&#xff0c;逐步形成一支政治可靠、技能过硬…

VUE小白学习-2023年6月7日

VUE小白学习-2023年6月7日 前端工程化 日期&#xff1a;2023年6月7日 前端工程化

SVN服务器简单配置过程

一、概述 SVN的全称是Subversion&#xff0c;是一个流行的开源的版本控制系统。Subversion可管理随时间改变的数据&#xff0c; 这些数据放置在一个中央资料档案库(repository) 中。 它就像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样当需要回退时&#xff0c;…

【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~

Java可执行命令之jarsigner 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法3.1.1 可选参数&#xff1a;jarsigner -keystore < url>3.1.2 可选参数&#xff1a;jarsigner -storepass <口令>3.1.3 可选参数&#xff1a;jarsigner -keypass <口令>3.1.4 可选参…