桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录

  • 一、引言
  • 二、应用场景与技术背景
  • 三、模式定义与实现
  • 四、实例详解
  • 五、优缺点分析
  • 总结:

一、引言

​ 桥接模式是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构,并使用组合而非继承来关联这两层,从而使得系统在面对多维度变化时,能够保持较低的耦合度,支持灵活扩展。

二、应用场景与技术背景

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

  1. 系统需要在多个维度上进行扩展,而这些维度的变化是相互独立的。
  2. 不希望使用继承来实现组件间的组合,因为这会导致类爆炸或过度耦合。

例如,在图形用户界面(GUI)库中,窗口有多种外观(如Windows风格、Mac风格),同时又有多种操作(如打开、关闭、最大化等)。桥接模式可以帮助我们将窗口外观和窗口操作这两个独立变化的维度进行解耦,让每种外观都能轻松搭配不同的操作实现。

三、模式定义与实现

桥接模式的核心组成部分包括:

在这里插入图片描述

  1. Abstraction(抽象化角色):定义抽象接口,维持一个指向Implementor对象的引用。
  2. RefinedAbstraction(具体抽象化角色):是Abstraction接口的一个实现,负责调用Implementor对象的方法并提供额外的功能。
  3. Implementor(实现化角色):定义实现化角色的接口,供Abstraction角色调用。
  4. ConcreteImplementor(具体实现化角色):实现了Implementor接口,提供了具体的实现。

四、实例详解

以打印机系统为例,品牌属于抽象实现,彩色打印、黑白打印 属于具体实现。

  1. 定义抽象化角色(Abstraction):首先创建一个表示打印机的抽象类Printer,该类包含一个指向打印技术实现对象的引用,并声明了print()方法。
public abstract class Printer {
    protected PrintTechnology technology;

    public void setPrintTechnology(PrintTechnology technology) {
        this.technology = technology;
    }

    // 抽象方法,由子类具体实现
    public abstract void print();
}
  1. 定义具体抽象化角色(Refined Abstraction):创建具体的打印机品牌如HPPrinter作为Printer的子类,它实现了print()方法,在调用打印功能时,会委托给关联的打印技术对象执行实际打印操作。
public class HPPrinter extends Printer {
    @Override
    public void print() {
        System.out.println("HP 打印机开始工作");
        technology.print(); // 调用实现化角色的方法
    }
}
  1. 定义实现化角色接口(Implementor):创建一个表示打印技术的接口PrintTechnology,声明了print()方法,为各种不同的打印技术提供统一的接口。
public interface PrintTechnology {
    void print();
}
  1. 定义具体实现化角色(Concrete Implementor):分别创建两种具体的打印技术实现类,如BlackAndWhitePrintTechnologyColorPrintTechnology,它们都实现了PrintTechnology接口,提供了黑白打印和彩色打印的具体实现。
public class BlackAndWhitePrintTechnology implements PrintTechnology {
    @Override
    public void print() {
        System.out.println("正在进行黑白打印...");
    }
}

public class ColorPrintTechnology implements PrintTechnology {
    @Override
    public void print() {
    System.out.println("正在进行彩色打印...");
    }
}
  1. 应用端使用:在应用程序中,根据需求动态组合不同的打印机品牌与打印技术。例如,可以创建一个HP品牌的打印机并设置其打印技术为黑白或彩色。
public class BridgePatternDemo {
    public static void main(String[] args) {
        Printer hpPrinter = new HPPrinter();

        // 设置打印技术为黑白打印
        hpPrinter.setPrintTechnology(new BlackAndWhitePrintTechnology());
        hpPrinter.print(); // 输出:HP 打印机开始工作\n正在进行黑白打印...

        System.out.println("===================");

        // 更改为彩色打印技术
        hpPrinter.setPrintTechnology(new ColorPrintTechnology());
        hpPrinter.print(); // 输出:HP 打印机开始工作\n正在进行彩色打印...
    }
}

测试结果

在这里插入图片描述

​ 通过以上步骤,桥接模式成功地将打印机的品牌(抽象化角色)与其支持的打印技术(实现化角色)解耦合,使得二者可以独立扩展而互不影响。在实际运行时,可以根据需要灵活配置打印机的品牌和打印技术,实现不同维度的组合变化。

五、优缺点分析

优点:

  1. 降低耦合:通过将抽象与实现分离,消除了抽象与实现之间的静态绑定关系,使得两者可以独立改变而不影响对方。
  2. 提高灵活性:新增或修改抽象化角色和实现化角色的子类时,不会对其他子类造成影响,增强了系统的可扩展性。

潜在挑战:

  1. 复杂性增加:引入了更多的类和层次结构,可能增加理解与维护成本。
  2. 过度设计风险:如果需求中不存在独立变化的维度,强行使用桥接模式可能导致设计过于复杂。

总结:

​ 桥接模式通过分离抽象与实现,为系统提供了更加灵活的设计结构,使得系统可以在多个维度上自由扩展。在实际应用中,合理运用桥接模式能有效解决因继承带来的紧耦合问题,提升代码的复用性和可维护性,尤其适用于那些需要应对多维度变化需求的软件设计。然而,也应注意避免在简单系统中过度设计,确保模式的应用符合实际需求和场景特点。

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

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

相关文章

普中51单片机学习(DS1302)

DS1302时钟 DS1302实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力。内部含有31个字节静态RAM,可提供用户访问。采用串行数据传送方式,使得管脚数量最少,简单SPI 3线接口。工作电压…

初识表及什么是数据表

一、了解表 1.1.概述 表是处理数据和建立关系型数据库及应用程序的基本单元,是构成数据库的基本元素之一,是数据库中数据组织并储存的单元,所有的数据都能以表格的形式组织,目的是可读性强。 1.2.表结构简述 一个表中包括行和列…

下载 axios.js 文件到本地【linux】

方式一 npm install axios在$NODE_PATH/node_modules/axios/dist路径下即可找到axios.js。 方式二 1、百度搜索 GitHub 官网:https://github.com/ 2、搜索 axios 3、点击 axios/axios 4、下载到本地 5、解压,进入到 dist 文件夹** 参考&#x…

实现可拖拽的页面元素排序更新数据库排序

摘要: 拖拽列表改变路边排序,并且更新后台数据库列表的排序,重新请求的时候获取拖拽后的排序! Layui: // 拖拽内页顺序list document.querySelector(#view_side_tab);// 创建cruentItem存放将要拖动的元素let cruen…

Zookeeper经典应用场景实战

Zookeeper经典应用场景实战 ZK的不足之处 watcher检测是一次性的,每次触发之后都需要重新注册会话超时之后没有实现重连机制异常处理繁琐仅提供byte数组类型的接口,没提供java实体序列化级接口创建节点时如果抛出异常,需要自行检查节点是否…

【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量形状操作

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算2. 矩阵…

【MySQL】多表操作、事务、索引

MySQL MYSQL 多表设计 一对多插入测试数据外键约束(物理外键)使用逻辑外键 MYSQL 多表设计 一对一表结构 MYSQL 多表设计 多对多 MYSQL 多表设计 一对多 建表语句 员工表 CREATE TABLE tb_emp (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT ID,username VARCHAR(20) N…

130 如何通过vs2017开发linux c++程序

使用VS2017开发linux下的应用程序(C/C)_vc_linux.exe vs2017-CSDN博客 参考上面这哥们的,写的很详细 前言 本文章记录如何使用VS2017进行linux应用程序的开发(针对新手小白),VS2017能较为方便的通过SSH编辑…

强大的文本绘图——PlantUML

PlantUML是一款开源工具,它允许用户通过简单的文本描述来创建UML图(统一建模语言图)。这种方法可以快速地绘制类图、用例图、序列图、状态图、活动图、组件图和部署图等UML图表。PlantUML使用一种领域特定语言(DSL)&am…

【Java程序设计】【C00282】基于Springboot的校园台球厅人员与设备管理系统(有论文)

基于Springboot的校园台球厅人员与设备管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园台球厅人员与设备管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xf…

【可申请试用】RT-Thread专业版全面支持瑞芯微RK3568系列平台并可实现混合部署...

RT-Thread 专业版是面向任务关键领域的高安全实时操作系统,已被广泛应用于航空航天,电力,轨交,车载,工业控制,新能源,医疗等国家重要领域,是各领域高可靠装备的基础核心软件。该版本…

C#,计算几何,计算机图形学(Computer Graphics)洪水填充算法(Flood Fill Algorithm)与源代码

1 泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法(Flood Fill Algorithm) ,又称洪水填充算法,是在很多图形绘制软件中常用的填充算法,最熟悉不过就是 windows 自带画图软件的油漆桶功能。 2 源程序 using System; using System.Collecti…

基于PostGIS的慢查询引起的空间索引提升实践

目录 前言 一、问题定位 1、前端接口定位 2、后台应用定位 3、找到问题所在 二、空间索引优化 1、数据库查询 2、创建空间索引 3、geography索引 4、再看前端响应 总结 前言 这是一个真实的案例,也是一个新入门的工程师很容易忽略的点。往往在设计数据库的…

【JVM】Java中SPI机制

打破双亲委派模型中提到SPI和JDBC相关内容,那么是如何打破双亲委派模型呢?本文进行一个讲解,在开始讲解之前,我们需要先了解Java中的SPI机制 是什么 SPI 全称Service Provider Interface,是 Java 提供的一套用来被第三方实现或…

《TCP/IP详解 卷一》第6章 DHCP

目录 6.1 引言 6.2 DHCP 6.2.1 地址池和租用 6.2.2 DHCP和BOOTP消息格式 6.2.3 DHCP和BOOTP选项 6.2.4 DHCP协议操作 6.2.5 DHCPv6 6.2.6 DCHP中继 6.2.7 DHCP认证 6.2.8 重新配置扩展 6.2.9 快速确认 6.2.10 位置信息(LCI和LoST) 6.2.11 移…

股票量化系统QTYX“单针探底”迎战A股V型反转|24年2月春节后第一周记录

前言 “实战案例个股画像”系列和大家分享我基于QTYX选股框架,在实战中选股的案例,和大家一起见证QTYX选股框架逐步完善的过程,帮助大家理解QTYX的精髓。 关于QTYX的使用攻略可以查看链接:QTYX使用攻略 关于QTYX初衷和精髓可以查看…

【计算机毕业设计】541鲜花商城系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Unity 2021.3发布WebGL设置以及nginx的配置

使用unity2021.3发布webgl 使用Unity制作好项目之后建议进行代码清理,这样会即将不用的命名空间去除,不然一会在发布的时候有些命名空间webgl会报错。 平台转换 将平台设置为webgl 设置色彩空间压缩方式 Compression Format 设置为DisabledDecompre…

Java 学习和实践笔记(19):this的使用方法

this用来指向当前对象的地址。 this的用法: 1)在普通方法中,this总是指向调用该方法的对象。在普通方法中,它是作为一种隐式参数一直就存在着(这句话的意思,就是其实在普通方法中,编译器一直就…

Word第一课

文章目录 1. 文件格式1.1 如何显示文件扩展名1.2 Word文档格式的演变1.3 常见的Word文档格式 3. 文档属性理解文档属性查看文档属性 4. 显示比例方式一: 手动调整方式二: 自动调整 5. 视图、窗口视图 1. 文件格式 1.1 如何显示文件扩展名 文档格式指的…