桥接模式(十)

news2024/11/28 2:44:47

不管怎么样,都要继续充满着希望

上一章简单介绍了适配器模式(九), 如果没有看过, 请观看上一章

一. 桥接模式

引用 菜鸟教程里面的 桥接模式介绍: https://www.runoob.com/design-pattern/bridge-pattern.html

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,

它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响

一.一 介绍

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码:抽象类依赖实现类。

应用实例

1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。

2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。

  1. JDBC 驱动程序
  2. 银行转账系统 (有分类和用户类型)
  3. 消息管理 (有消息类型,即时/延时, 有消息的分类,手机,邮箱等)

优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

image-20230614161005310

如手机的品牌 和手机打开的方式 ( 上,下)是不同的信息。
注意,用大的范围在外面, 引用小的范围。

组成角色具体关系作用
ImplementorBrand行为实现类的接口行为实现类的接口
ConcreteImplementorA /BHuaWeiBrand,XiaoMiBrand行为的具体实现类行为的具体实现类
抽象类(Abstraction)Phone维护行为维护行为
RefinedAbstractionUpPhone,DownPhone是 Abstraction 抽象类的子类是 Abstraction 抽象类的子类

二. 桥接应用

二.一 品牌接口

public interface Brand {

    void sendMessage();

    void open();

    void close();

    void call();

}

二.二 品牌实现

@Slf4j
public class HuaWeiBrand implements Brand{

    @Override
    public void sendMessage() {
        log.info("华为手机实现发送短信功能");
    }

    @Override
    public void open() {
        log.info("华为手机实现发送开机");
    }

    @Override
    public void close() {
        log.info("华为手机实现关机");
    }

    @Override
    public void call() {
        log.info("华为手机实现打电话");
    }
}

@Slf4j
public class XiaoMiBrand implements Brand{

    @Override
    public void sendMessage() {
        log.info("小米手机实现发送短信功能");
    }

    @Override
    public void open() {
        log.info("小米手机实现发送开机");
    }

    @Override
    public void close() {
        log.info("小米手机实现关机");
    }

    @Override
    public void call() {
        log.info("小米手机实现打电话");
    }
}

二.三 手机 Phone

依赖 Brand

public abstract class Phone {

    private Brand brand ;

    public Phone (Brand brand) {
        this.brand = brand;
    }

    public void sendMessage() {
       brand.sendMessage();
    }

    public void open() {
        brand.open();
    }

    public void close() {
        brand.close();
    }

    public void call() {
        brand.call();
    }
}

二.四 抽象类实现

public class UpPhone extends Phone{

    public UpPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void sendMessage() {
        super.sendMessage();
    }

    @Override
    public void open() {
        super.open();
    }

    @Override
    public void close() {
        super.close();
    }

    @Override
    public void call() {
        super.call();
    }
}
public class DownPhone extends Phone{

    public DownPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void sendMessage() {
        super.sendMessage();
    }

    @Override
    public void open() {
        super.open();
    }

    @Override
    public void close() {
        super.close();
    }

    @Override
    public void call() {
        super.call();
    }
}

二.五 测试调用

 @Test
    public void oneTest() {
        Phone phone = new UpPhone(new XiaoMiBrand());
        phone.open();
        phone.close();

        phone = new DownPhone(new XiaoMiBrand());

        phone.sendMessage();
        phone.call();
    }

image-20230614161808670

桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Bridge


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

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

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

相关文章

GitHub 2800颗星,支持GPT/Transformer,字节跳动这个开源项目是怎么来的?

AI 绘画、机器翻译、多轮对话……对于各类 AI 相关的功能来说,总有一个痛点,困扰着所有训模型的算法工程师们: 想要效果更好,那么 AI 模型一般都很大,耗费的算力更多不说,运行起来还更费时间; 如…

关键字static,final的使用

关键字:static 概念 是java中的一个关键字 用于修饰成员(成员变量和成员方法) 类属性、类方法的设计思想 概念: 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实 质上的对象&#x…

使用递归SQL实现树形参数的转换(后传前)

1、什么是递归SQL 递归 SQL(Recursive SQL)是一种 SQL 查询语言的扩展,它允许在查询中使用递归算法。递归 SQL 通常用于处理树形结构或层次结构数据,例如组织结构、产品分类、地理位置等。 递归 SQL 语句通常包含两个部分&#xf…

大数据入门-大数据技术概述(一)

大数据入门系列文章 大数据入门-大数据是什么 一、概念 大数据技术是指在构架大数据平台的时候需要的技术。包含存储系统,数据库,数据仓库,资源调度,查询引擎,实时框架等。下面以我目前所了解到的一些技术做简要介绍…

React学习笔记十-生命周期(旧)

此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第十篇,主要介绍React非常重要的组件的生命周期(旧)。要学习react新的生命周期,那必须先学习旧的生命周期。 目录 1.引出生命周期概念 1.1案例 1.1.1案例卸…

snmp默认团体名/弱口令漏洞及安全加固

一、漏洞描述 SNMP(简单网络管理协议)被广泛用于计算机操作系统设备、网络设备等领域监测连接到网络上的设备是否有任何引起管理上关注的情况。在运行SNMP服务的设备上,若管理员配置不当运行默认团体名/弱口令访问,将导致敏感信息泄露。敏感…

Sentinel源码分析-ProceesorSlotChain调用链及树状资源节点

Sentinel 实现流控,隔离,降级等功能,本质要做两件事: 数据统计: 统计某个资源的访问数据(QPS,RT(响应时间),异常比例)等信息规则判断: 判断流控规…

攻略 | 如何拿下奖金534万的全国人工智能大赛?

全国人工智能大赛已连续成功举办三届,累计吸引全球20个国家、1万多支队伍参与竞技,已成为人工智能领域参与规模和影响力都名列前茅的顶级赛事。作为头部科技企业、高等院校和科研院所的链接平台,大赛在促进产学研融合、推动多项成果落地方面成…

比后缀Ti更香的N卡全能型号回归,40显卡终于不恶心了

NVIDIA RTX 40 系显卡上市有一段时间了,不过大家给出的一致看法是:除了 4090 外,其他型号暂时都不值得购买! 倒不是说他们性能多拉胯,主要是核心规格与价格属实不那么匹配。 特别是主流的 RTX 4060、4070 级别&#…

flask搭建在线音乐网系统

1.使用虚拟环境Virtualenv来创建项目 2. Flask框架介绍 Flask框架是一个用Python编写的轻量级Web应用程序框架,依赖于Werkzeug和Jinja2两个外部库。Werkzeug是一个WSGI工具包,用于接收和处理HTTP请求,匹配视图函数,支持Cookie和会…

基于Java社区文化宣传网站设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

2023年5月国产数据库大事记-墨天轮

本文为墨天轮社区整理的2023年5月国产数据库大事件和重要产品发布消息。 目录 5月国产数据库大事记 TOP105月国产数据库大事记(时间线)产品/版本发布兼容认证代表厂商大事记排行榜新增数据库厂商活动 5月国产数据库大事记 TOP10 5月国产数据库大事记&…

高考之后想学习网络安全,网络安全/信息安全是一个好的专业吗?

本人信息安全专业毕业,在甲方互联网大厂安全部与安全乙方大厂都工作过,有一些经验可以供对安全行业感兴趣的人参考。 或许是因为韩商言让更多人知道了CTF,也或许是因为网络安全越来越受国家重视,安全最近愈加火爆了。当然&#x…

C++初阶—list深度解剖及模拟实现

目录 ➡️0. 前言 😊1.简易框架实现 🐔1. list和__list_node分析实现 🐔2. 无参构造 😊2.迭代器实现 🐔1. list普通迭代器面临问题及解决方案 🐔2. __list_node\iterator\list三类分析 &#x1f41…

内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 )

内网安全:Cobalt Strike 与 MSF 联动( 会话 相互转移 ) 在渗透中,有时候 Cobalt Strike 会话可能会受限制,所以我们需要把 Cobalt Strike 会话转移到 MSF 上进行后面的渗透。也有的时候会话在 MSF 上,但是…

大数据学习归纳

本文初衷是为了学习归纳,若有错误,请指出。 修改记录 时间内容2020年4月10日第一次发布2020年4月16日添加MaxCompute SQL部分2020年9月14日新增数仓部分笔记 大数据架构 基础知识题 大数据组件概念 集群:多个人做同样的事 分布式:…

Visual Studio Community 2022 + Win10 编译 OpenCPN 5.9.0 记录

前言 前两天尝试用vs2017编译OpenCPN5.0.0,前后折腾了两三天总算编译成功了。官网给出的编译过程比较简单,我在实际编译过程中遇上了很多很多的问题,最多的就是缺少库,好在最后编译通过了。 后来浏览OpenCPN官网的时候发现发布了…

【Spring】开发框架Spring核心技术含Resource接口详细讲解

前言 Spring 是 Java EE 编程领域的一款轻量级的开源框架,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。 Spring 自诞生以来备受青睐,一直被广大开发人员作为 Java…

测试工程师常用的10个python库,面试必备哦

目录 前言 1、os库 2、sys库 3、time库 4、selenium库 5、unittest库 6、pytest库 7、email库 8、appium库 9、pymsql库 10、requests库 总结: 前言 今天给各位小伙伴带来的是测试工程师常用的10个python库,相信有些小伙伴肯定知道一些库&am…

aclocal-1.14 is missing on your system

在编译 bluez 的时候出现如下错误: 没有找到 aclocal-1.14, 但是有 aclocal-1.13 版本的,那最直接的方法就是修改 Makefile了,搜索出来 Makefile 指定了 aclocal-1.14,修改成 aclocal-1.13 即可。修改完还会有如下的错…