java 桥接模式

news2024/10/6 6:04:58

桥接模式

    • 桥接模式简介
    • 桥接模式的实现
    • 总结

桥接模式简介

桥接模式(Bridge)是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。

桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

桥接模式的实现

桥接(Bridge)模式包含以下主要角色。

抽象化(Abstraction)角色: 定义抽象类,并包含一个对实现化(Implementor)角色的引用。Abstraction 充当桥接类。
扩展抽象化(Refined Abstraction)角色: 是抽象化(Abstraction)角色的子类,实现父类中的业务方法,并通过组合关系调用实现化(Implementor)角色中的业务方法。
实现化(Implementor)角色: 定义实现化角色的接口,供扩展抽象化(Refined Abstraction)角色调用。
具体实现化(Concrete Implementor)角色: 给出实现化(Implementor)角色接口的具体实现。

  1. 定义实现化角色的接口:
public interface Brand {

    void open();
    void close();
    void call();
}
  1. 定义具体实现化角色:给出实现化(Implementor)角色接口的具体实现。

    定义具体实现化角色1:

public class XiaoMi implements Brand{
    @Override
    public void open() {
        System.out.println("小米手机开机");
    }

    @Override
    public void close() {
        System.out.println("小米手机关机");
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }
}

定义具体实现化角色2:

public class Vivo implements Brand{
    @Override
    public void open() {
        System.out.println("Vivo手机开机");

    }

    @Override
    public void close() {
        System.out.println("Vivo手机关机");

    }

    @Override
    public void call() {
        System.out.println("Vivo手机打电话");

    }
}
  1. 定义抽象化(Abstraction)角色:里面包含了对实现化角色的接口的引用
public abstract class Phone {

    //组合Brand接口
    private Brand brand;

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

    //调用接口里的方法,当该类的子类调用该类的方法时就会调用到接口里的方法
    protected void open(){
        brand.open();
    }

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

    protected void call(){
        brand.call();
    }
}
  1. 定义扩展抽象化(Refined Abstraction)角色:是抽象化(Abstraction)角色的子类,实现父类中的业务方法,并通过组合关系调用实现化(Implementor)角色中的业务方法。
public class FoldedPhone extends Phone{

    public FoldedPhone(Brand brand){
        super(brand);//调用父类的构造器初始化
    }

    public void open(){
        super.open();//通过组合关系调用实现化(Implementor)角色中的业务方法
        System.out.println("折叠样式手机");
    }

    public void close(){
        super.close();
        System.out.println("折叠样式手机");
    }

    public void call(){
        super.call();
        System.out.println("折叠样式手机");

    }
}
  1. 定义客户端测试桥接模式:
public class Client {
    public static void main(String[] args) {
        FoldedPhone phone = new FoldedPhone(new XiaoMi());
        phone.open();
        phone.close();
        phone.call();


        System.out.println();
        FoldedPhone phone1 = new FoldedPhone(new Vivo());
        phone1.open();
        phone1.close();
        phone1.call();

    }
}

在这里插入图片描述
当我们要增加一个扩展抽象化(Refined Abstraction)角色,只需继承抽象化(Abstraction)角色(桥接类)即可.

总结

优点:

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

缺点:

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难题

注意事项:

  • 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。

  • 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。

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

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

  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

桥接模式通常适用于以下场景:

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

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

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

相关文章

C# VS调试技巧

一.按照条件调试步骤 ①在需要代码执行的行打断点 ②触发此断点,让代码执行到此处 ③鼠标滑至在断点处,点击设置 ④设置断点条件,如下图所示 二、多线程调试技巧 ①在需要代码执行的行打断点 ②触发此断点,让代码执行到此处…

微服务dubbo和nexus

微服务是一种软件开发架构风格,它将一个应用程序拆分成一组小型、独立的服务,每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制(通常是 HTTP/REST 或消息队列)相互通信。微服务架构追求高内聚、低耦合&am…

本地启动若依微服务版本

前置工作: 1.导入sql文件 2.安装完nacos 3.安装完redis 启动步骤: 1.开启nacos,在bin目录下 startup.cmd -m standalone 注意:在这之前要配置nacos持久化,修改conf/application.properties文件,增加支持…

打架斗殴监测识别算法 yolov8

打架斗殴监测识别算法采用yolov8先进的图像处理和机器学习算法框架模型,打架斗殴监测识别算法能够自动识别和分析出打架斗殴的行为特征。一旦系统检测到打架斗殴行为,将自动触发告警。YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全…

SpringBoot初级开发--加入ElasticSearch数据源(4)

ES就不用我说了吧&#xff0c;如果是安装的话可以参考我这边blog《Centos7.9安装ElasticSearch6》&#xff0c;安装好ES&#xff0c;接下来我们配置SpringBoot.在配置之前&#xff0c;先看看版本对应表。 1.修改POM文件的依赖 <!-- ES 默认对应springboot的版本 --><…

未来科技城携手加速科技 共建集成电路测试公共服务平台!

8月26日&#xff0c;2023未来产业发展大会在杭州未来科技城国际会议中心开幕&#xff01;会上&#xff0c;发布了未来科技城培育发展未来产业行动计划&#xff0c;启动了未来产业发展共同体&#xff0c;进行了未来产业公共服务平台签约仪式。未来科技城与加速科技签约共建集成电…

Linux枚举文件目录、获取文件属性

目录 1.枚举指定路径下的文件目录2.获取文件属性stat其他方式&#xff1a;Linux获取文件属性stat()、fstat()、lstat()函数实现stat属性代码 1.枚举指定路径下的文件目录 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.…

java+springboot+mysql水电管理系统

项目介绍&#xff1a; 本系统为新版基于SpringBoot的水电管理系统&#xff1a; 使用javaspringbootmysql开发的水电费管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理、用户管理…

成功通过技术面试的策略:程序员必备指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

2023-8-28 图中点的层次(树与图的广度优先遍历)

题目链接&#xff1a;图中点的层次 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 100010;int h[N], e[N], ne[N], idx; int n, m; int q[N], d[N];void add(int a, int b) {e[idx] b, ne[idx] h[a], h…

小蜗语音工具1.9、文本,小说,字幕生成语音、多角色对话,语音识别、读取音频字幕

小蜗语音免费工具 一、文本转字幕文本内容和TXT文件 二、文本转语音1、文本内容生成语音2、字幕生成语音3、多角色对话4、选择文件5、批量处理 三、语音识别、音频MP31、语音识别2、下载模型下载地址 一、文本转字幕 可以把正本小说&#xff0c;生成字幕文件。不限制文件的大小…

Exchange-CVE-2020-0688(RCE)

漏洞描述 当攻击者通过各种手段获得一个可以访问Exchange Control Panel &#xff08;ECP&#xff09;组件的用户账号密码&#xff0c;就可以在被攻击的exchange上执行任意代码&#xff0c;直接获取服务器权限。 CVE-2020-0688也是因为viewstate反序列化 漏洞版本 利用条件&…

雅思听力考点词 积累

目录 雅思听力4个部分 雅思听力答题策略 雅思听力12大场景词汇 1 求职 2 图书馆 3 生活 4 天气地形 5 医疗 6 旅游 7 住宿 8 入学 9 运动 10 环境 11 教育 12 音乐 雅思听力 Part 1 4.1 听力Part 1主要内容 4.2 听力Part 1主要题型&#xff1a;Form Completi…

jq插件:jqgrid和validform的二次封装

做久了vue和react框架项目&#xff0c;偶尔也需要做做原生的项目。不可否认vue的双向绑定机制确实很香&#xff0c;但是也是建立在原生js基础上。所以&#xff0c;只有做更多的原生js项目&#xff0c;才能更加了解vue框架的底层原理。在日常开发中&#xff0c;也会不可避免的会…

element-ui 弹窗里面嵌套弹窗,解决第二个弹窗被遮罩层掩盖无法显示的问题

当我们在 element-ui 中使用弹窗嵌套弹窗时&#xff0c;会出现第二个弹窗打开时被一个遮罩层挡着&#xff0c;就像下面这样&#xff1a; 下面提供两种解决方案 &#xff1a; 一、第一种方案 我们查询element-ui 官网可以发现 el-dialog 有这样几个属性&#xff1a; 具体使用就…

【C语言基础】const关键词的使用方法

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

App卡帧与BlockCanary

作者&#xff1a;图个喜庆 一&#xff0c;前言 app卡帧一直是性能优化的一个重要方面&#xff0c;虽然现在手机硬件性能越来越高&#xff0c;明显的卡帧现象越来越少&#xff0c;但是了解卡帧相关的知识还是非常有必要的。 本文分两部分从app卡帧的原理出发&#xff0c;讨论屏…

《Flink学习笔记》——第六章 Flink的时间和窗口

6.1 时间语义 6.1.1 Flink中的时间语义 对于一台机器而言&#xff0c;时间就是系统时间。但是Flink是一个分布式处理系统&#xff0c;多台机器“各自为政”&#xff0c;没有统一的时钟&#xff0c;各自有各自的系统时间。而对于并行的子任务来说&#xff0c;在不同的节点&…

mysql 8 jdbc连接报错:Caused by: java.sql.SOLNonTransientConnectionException: Cannot load connection clas

问题现象&#xff1a;如下图所示&#xff1a; 错误信息为&#xff1a; Caused by: java.sql.SOLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.e 32 xceptions.WrongArgumentException: Malformed database …

高亮img、pdf重点部分(html2canvas、pdfjs-dist、react-pdf)

可用业务场景 报销单据审批中&#xff0c;高亮发票部分 需求 后台返回一张图片或者pdf、返回一组坐标&#xff0c;坐标类型[number,number,number,number]&#xff0c;分别代表了x、y、width、height。需要根据坐标在图片上高亮出来坐标位置。如下图 高亮的坐标是&#xff1…