Java二十三种设计模式-桥接模式(10/23)

news2024/9/29 19:17:26

桥接模式:解耦抽象与实现的灵活设计

引言

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

基础知识,java设计模式总体来说设计模式分为三大类:

(1)创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

(2)结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

(3)行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

第一部分:桥接模式概述

1.1 定义与用途

桥接模式的基本定义

桥接模式(Bridge Pattern)是一种结构型设计模式,其核心思想是将类的抽象部分与它的实现部分分离,使它们可以独立地变化。这种模式允许系统在不修改原有抽象层代码的情况下,通过更换实现层来扩展系统的功能。

解释为何需要桥接模式

  • 解耦抽象与实现:在软件开发中,经常会遇到抽象和实现紧密耦合的情况,这限制了系统的灵活性和可扩展性。桥接模式通过将它们分离,提高了系统的灵活性。
  • 扩展系统功能:使用桥接模式,可以在不修改原有抽象类代码的情况下,通过增加新的实现类来扩展系统的功能。
  • 避免多重继承:在不支持多重继承的语言中,桥接模式提供了一种替代方案,允许一个类同时具备多个接口的特征。

1.2 桥接模式的组成

抽象化(Abstraction)

  • 定义:定义了抽象类的接口,规定了可以关联的具体实现化角色。
  • 角色:作为桥接模式的基础,抽象化角色将业务逻辑与实现细节分离。

抽象化实现(Refined Abstraction)

  • 定义:扩展抽象化角色,添加了对具体实现化对象的引用,并实现更具体的业务逻辑。
  • 角色:具体抽象化角色提供了与抽象化角色一致或更丰富的接口,并委托具体实现化角色来完成某些操作。

实现化(Implementor)

  • 定义:定义了实现化角色的接口,它规定了实现化对象必须实现的接口。
  • 角色:实现化角色是桥接模式中的具体实现部分,它独立于抽象化角色变化。

具体实现化(Concrete Implementor)

  • 定义:实现了实现化角色的接口,提供了具体的实现细节。
  • 角色:具体实现化角色是实现化角色的具体实现,它定义了实现化接口的具体行为。

客户端(Client)

  • 角色:使用抽象化角色来完成业务逻辑,并通过抽象化角色与实现化角色交互。

桥接模式通过这种角色分离,使得抽象部分和实现部分可以独立地变化,从而提高了系统的灵活性和可扩展性。在下一部分中,我们将通过Java代码示例来展示桥接模式的具体实现。

第二部分:桥接模式的实现

2.1 Java实现示例

以下是使用Java语言实现桥接模式的代码示例。假设我们有一个图形接口,它有不同的实现方式,如圆形和矩形,并且每种图形都有多种绘制方式,如实线和虚线。

// 实现化接口
interface DrawingAPI {
    void draw();
}

// 具体实现化:实线图形
class SolidDrawingAPI implements DrawingAPI {
    @Override
    public void draw() {
        System.out.println("Drawing with solid lines.");
    }
}

// 具体实现化:虚线图形
class DashedDrawingAPI implements DrawingAPI {
    @Override
    public void draw() {
        System.out.println("Drawing with dashed lines.");
    }
}

// 抽象化角色
abstract class Shape {
    protected DrawingAPI drawingAPI;

    public Shape(DrawingAPI drawingAPI) {
        this.drawingAPI = drawingAPI;
    }

    abstract void draw();
}

// 具体抽象化:圆形
class Circle extends Shape {
    private float radius;

    public Circle(DrawingAPI drawingAPI, float radius) {
        super(drawingAPI);
        this.radius = radius;
    }

    @Override
    void draw() {
        drawingAPI.draw();
        System.out.println("Drawing a circle with radius " + radius);
    }
}

// 具体抽象化:矩形
class Rectangle extends Shape {
    private float width;
    private float height;

    public Rectangle(DrawingAPI drawingAPI, float width, float height) {
        super(drawingAPI);
        this.width = width;
        this.height = height;
    }

    @Override
    void draw() {
        drawingAPI.draw();
        System.out.println("Drawing a rectangle with width " + width + " and height " + height);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        DrawingAPI solidAPI = new SolidDrawingAPI();
        DrawingAPI dashedAPI = new DashedDrawingAPI();

        Shape circle = new Circle(solidAPI, 5.0f);
        circle.draw();

        Shape rectangle = new Rectangle(dashedAPI, 4.0f, 6.0f);
        rectangle.draw();
    }
}

2.2 桥接模式中的角色和职责

抽象化(Abstraction)

  • 职责:定义了与实现化角色之间的接口,不涉及具体的实现细节。

抽象化实现(Refined Abstraction)

  • 职责:扩展抽象化角色,实现更具体的业务逻辑,并使用实现化角色来完成某些操作。

实现化(Implementor)

  • 职责:定义了实现化角色的接口,提供了一个或多个方法供抽象化角色调用。

具体实现化(Concrete Implementor)

  • 职责:实现了实现化接口的具体类,提供了实现化接口的具体实现。

相互作用

  • 抽象化与实现化:抽象化角色通过组合实现化角色来实现自己的部分行为。
  • 具体抽象化与具体实现化:具体抽象化角色通过组合具体实现化角色来完成具体的行为。

桥接模式通过将抽象部分与实现部分分离,允许它们独立地扩展和变化。这种模式提高了系统的灵活性和可扩展性,使得在不修改原有代码的情况下,可以通过增加新的实现类来扩展系统的功能。在下一部分中,我们将探讨桥接模式的使用场景。

第三部分:桥接模式的使用场景

3.1 系统需要独立变化的两个维度

在软件设计中,经常会遇到需要从两个或多个维度进行扩展的情况。例如,一个图形界面库可能需要支持不同类型的图形(如圆形、矩形等)以及不同的绘制样式(如实线、虚线等)。每个维度都可能独立变化,增加新的图形类型或绘制样式。

桥接模式的应用:

  • 独立变化:桥接模式允许抽象部分(如图形类型)和实现部分(如绘制样式)独立变化,互不影响。
  • 扩展性:当需要添加新的图形类型或绘制样式时,只需添加相应的具体抽象化角色或具体实现化角色,无需修改现有代码。
  • 灵活性:客户端代码通过抽象化角色与系统交互,不同的抽象化角色可以绑定不同的实现化角色,提供了高度的灵活性。

应用实例:

  • 图形界面库:如上文所述,图形界面库可以通过桥接模式支持不同类型的图形和绘制样式。
  • 软件渲染引擎:渲染引擎可以使用桥接模式,将渲染对象(如3D模型、纹理等)与渲染技术(如光照、着色等)分离。

3.2 避免多重继承

在某些编程语言中,多重继承可能不被支持或不推荐使用,因为它可能导致复杂的继承关系和难以解决的冲突问题。

桥接模式的优势:

  • 避免多重继承:桥接模式提供了一种避免多重继承问题的方法,通过组合而非继承来实现代码复用。
  • 减少继承层次:桥接模式减少了继承层次,使得系统更加扁平化,简化了类之间的关系。
  • 灵活性与安全性:相比于继承,组合提供了更高的灵活性,并且可以更好地控制访问权限和行为。

应用实例:

  • 企业应用架构:在企业应用中,业务逻辑和数据访问层可能需要独立变化。桥接模式可以避免因使用多重继承带来的复杂性。
  • 游戏开发:游戏中的角色(如敌人、主角等)和行为(如移动、攻击等)可以通过桥接模式进行分离,避免使用多重继承。

桥接模式通过将抽象与实现分离,提供了一种灵活且有效的方式来处理系统中独立变化的多个维度,并避免了多重继承可能带来的问题。在下一部分中,我们将讨论桥接模式的优点与缺点。

第四部分:桥接模式的优点与缺点

4.1 优点

提高系统的灵活性

  • 独立变化:桥接模式使得抽象部分和实现部分可以独立变化,互不影响,从而提高了系统的灵活性。

增强可扩展性

  • 扩展实现:当需要增加新的实现时,只需添加具体实现化类而无需修改抽象类,遵循开闭原则。

避免多重继承问题

  • 减少继承:在不支持多重继承的语言中,桥接模式通过使用组合代替继承,避免了多重继承的问题。

简化系统

  • 解耦组件:桥接模式通过解耦系统的不同组件,简化了系统的结构,使得各部分更容易理解和维护。

提升代码复用性

  • 共享实现:相同的实现类可以在不同的抽象类中被复用,提高了代码的复用性。

4.2 缺点

增加系统的复杂性

  • 类的数量:桥接模式可能会增加系统中类的数量,因为每个抽象类都需要对应的实现类。

设计难度

  • 理解难度:对于不熟悉桥接模式的开发者来说,理解这种模式的结构和意图可能有一定难度。

实现复杂性

  • 实现细节:在桥接模式中,实现类的实现细节可能变得复杂,尤其是当多个抽象类需要协调时。

性能考虑

  • 性能开销:在某些情况下,桥接模式可能会引入额外的性能开销,尤其是在需要频繁切换实现时。

过度设计

  • 适用性:如果问题不需要复杂的抽象和实现分离,使用桥接模式可能是一种过度设计。

桥接模式是一种强大的设计模式,它通过将抽象与实现分离,提高了系统的灵活性和可扩展性。然而,它也需要谨慎使用,以避免增加系统的复杂性和设计难度。在实际应用中,根据具体需求和场景选择是否使用桥接模式是非常重要的。在下一部分中,我们将比较桥接模式与其他设计模式,并提供一些最佳实践和建议。

第五部分:桥接模式与其他模式的比较

5.1 与适配器模式的比较

适配器模式

  • 目的:适配器模式主要用于使不兼容的接口能够一起工作,它通常转换一个类的接口以符合另一个接口的需求。
  • 实现:适配器模式通常包含一个包装对象,该对象将请求从客户端转发到被适配者。

桥接模式

  • 目的:桥接模式主要用于将抽象部分与实现部分分离,以便它们可以独立地变化。
  • 实现:桥接模式通过组合关系将实现化角色与抽象化角色解耦,允许独立地扩展抽象和实现。

对比

  • 解耦方式:适配器模式主要用于解决接口不兼容的问题,而桥接模式用于解耦抽象和实现,以便它们可以独立扩展。
  • 使用场景:适配器模式适用于需要将一个类的接口适配到另一个接口的场景,而桥接模式适用于需要独立变化的多个维度。

5.2 与外观模式的对比

外观模式

  • 目的:外观模式提供了一个统一的高层接口,用于访问子系统中的一组接口,它隐藏了子系统内部的复杂性。
  • 实现:外观模式定义了一个类,该类作为客户端与子系统交互的单一入口点。

桥接模式

  • 目的:桥接模式用于将抽象部分与实现部分分离,以便它们可以独立地变化和扩展。
  • 实现:桥接模式通过抽象化和实现化角色的组合,允许抽象和实现独立变化。

对比

  • 简化访问:外观模式主要用于简化客户端对复杂系统的访问,而桥接模式主要用于解耦抽象和实现。
  • 使用场景:外观模式适用于需要简化客户端与复杂子系统交互的场景,而桥接模式适用于需要独立扩展抽象和实现的场景。

桥接模式和外观模式都用于简化系统设计,但它们的关注点和应用场景不同。桥接模式强调抽象与实现的独立性,而外观模式强调简化客户端对复杂系统的访问。在实际应用中,根据具体需求和场景选择合适的设计模式是非常重要的。在下一部分中,我们将提供桥接模式的最佳实践和建议。

第六部分:桥接模式的最佳实践和建议

6.1 最佳实践

保持抽象和实现的独立性

  • 分离关注点:确保抽象层专注于定义业务功能,而实现层专注于具体的操作细节。

明确角色职责

  • 职责划分:清晰地划分抽象化和实现化角色的职责,避免角色之间的职责重叠。

提供灵活的组合

  • 动态绑定:利用组合的灵活性,允许在运行时动态地更换实现化角色。

避免紧密耦合

  • 松散耦合:通过桥接模式减少组件之间的直接依赖,实现松散耦合。

使用组合而非继承

  • 优先使用组合:在可能的情况下,优先使用组合来实现桥接模式,而不是依赖继承。

6.2 避免滥用

避免过度设计

  • 合理应用:仅在系统确实需要独立变化的多个维度时使用桥接模式,避免无谓的过度设计。

避免增加不必要的复杂性

  • 简化设计:如果系统简单,避免引入复杂的桥接模式,以免增加理解成本和维护难度。

避免过度封装

  • 适度封装:在保持实现细节隐藏的同时,确保不会过度封装,导致客户端难以使用。

6.3 替代方案

使用策略模式

  • 定义一系列算法:当需要根据不同的策略动态改变对象行为时,可以使用策略模式。

使用状态模式

  • 管理状态转换:当对象的状态变化涉及复杂的状态转换逻辑时,可以使用状态模式。

使用装饰者模式

  • 动态添加职责:当需要动态地给对象添加额外职责时,可以使用装饰者模式。

使用组合模式

  • 表示部分-整体结构:当需要表示对象的部分-整体层次结构时,可以使用组合模式。

使用依赖注入

  • 管理依赖关系:通过依赖注入来管理对象的依赖关系,而不是通过硬编码的方式。

桥接模式是一种强大的设计模式,可以提高系统的灵活性和可扩展性。然而,合理使用桥接模式并避免其缺点是至关重要的。了解其替代方案可以帮助开发者根据具体需求和场景选择最合适的设计模式。在实际开发中,应根据具体情况灵活运用桥接模式,以达到最佳的设计效果。

结语

桥接模式提供了一种有效的方法来解耦抽象与实现,使得它们可以独立地变化和扩展。通过本文的深入分析,希望读者能够对桥接模式有更全面的理解,并在实际开发中做出合理的设计选择。

 博主还写了其他Java设计模式文章,请各位大佬批评指正:

Java二十三种设计模式-单例模式(1/23)

Java二十三种设计模式-工厂方法模式(2/23)

Java二十三种设计模式-抽象工厂模式(3/23)

Java二十三种设计模式-建造者模式(4/23)

Java二十三种设计模式-原型模式(5/23)

Java二十三种设计模式-适配器模式(6/23)

Java二十三种设计模式-装饰器模式(7/23)

Java二十三种设计模式-代理模式(8/23)

Java二十三种设计模式-外观模式(9/23)

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

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

相关文章

PCL1.11.0下载安装(Windows)

PCL1.11.0下载安装(Windows) PCL安装需要的几个模块如下图所示: 一、PCL1.11.0下载 PCL以1.11.0版本为例,打开下载连接(PCL下载) 下载PCL-1.11.0-AllInOne-msvc2019-win64.exe和pcl-1.11.0-pdb-msvc2019-…

Springboot指定扫描路径

方式一:通过在启动类的SpringbootApplication中指定包扫描或类扫描 指定需要扫描的包 scanBasePackages{"待扫描包1","待扫描包2", . . . ," "} 指定需要扫描的类 scanBasePackageClasses{类1.class,类2.class,...} 方式二&#xff…

Linux系统编程 --- 动静态库

一、回顾,制作一个库 libXXX.a --- 静态链接 libYYY.so --- 动态链接 设计一个库: 把我们提供的方法,给别人用: 1、把源文件直接给他 2、把我们的源代码打包成库 库 头文件。 原理:把所有的.o文件打包成.a文件也…

(免费领源码)python#Django#MYSQL医院预约挂号系统24802-计算机毕业设计项目选题推荐

摘 要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个基于django 医院预约挂号系统 ,会使;医院预约挂号系统的管理工作系统化、规范化,也会提高平台形象&a…

宝塔企业版安装命令

使用方法 安装脚本: wget -O install.sh https://www.xpnal.cn/install/install_6.0.sh \&\& bash install.sh 更新脚本: curl https://www.xpnal.cn/install/update6.sh|bash 脚本说明: 没有安装过宝塔直接执行安装脚本,安装过执行更新脚本。 提醒 …

【Material-UI】多选模式(Multiple values)与Autocomplete的高级用法解析

文章目录 一、多选模式的基本用法二、高级用法1. 固定选项(Fixed options)2. 复选框(Checkboxes)3. 限制标签显示数量(Limit tags) 三、性能优化与最佳实践1. 筛选已选项(filterSelectedOptions…

Scratch的下载与安装

如果你在某搜索引擎用这个,就是离被骗钱不远了 添加图片注释,不超过 140 字(可选) 废话不多说,直接放软件安装包。重要的事情说三遍,收费的全是骗人的!收费的全是骗人的!收费的全是…

【C++题解】1015. 鸡兔同笼问题

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1015. 鸡兔同笼问题 类型:简单穷举 题目描述: 鸡兔同笼问题:一个笼子里面有鸡若干只,兔若干只。共有头 50 个,共有腿 16…

C语言的回调函数(详解qsort函数)

在上一篇文章中我们学习了指针与数组之间的关系,学习了指针数组,数组指针变量,函数指针变量和函数指针数组。那么接下来我们要学习的是一个利用函数指针变量去解决和简化各种问题的回调函数。 一、回调函数 回调函数在编程中是一种很常见的…

pip install -r requirements.txt下载某个.whl文件较慢的问题

访问PYPI官网。搜索该文件名字 如果不是自己要的版本,点击左边的Release history。 选择版本后再次在Download files页面下载.whl文件 下载完之后切换至自己的项目解释器虚拟环境。 python -m pip install 文件名.whl 如果你改名python.exe为python3.exe&#xff…

【消息队列】RabbitMQ 面试篇

🎗️ 主页:小夜时雨 🎗️专栏:消息队列 🎗️如何活着,是我找寻的方向 目录 1. RabbitMQ 有哪些工作模式?2. 如何保证消息不丢失(可靠性)3. 什么是死信队列,如…

基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

运行效果: 基于K210的智能人脸与车牌识别系统工程 目录: 运行效果: 目录: 前言: 一、国内外研究现状与发展趋势 二、相关技术基础 2.1 人脸识别技术 2.2 车牌识别技术 三、智能小区门禁系统设计 3.1 系统设计方案 3.2 …

【网络编程】网络原理(一)

系列文章目录 1、 初识网络 2、网络编程的基础使用(一) 文章目录 系列文章目录前言一、端口号的使用二、UDP报文学习1.报文格式2.MD5算法 总结 前言 在前文中,主要对UDP和TCP协议有了简单的了解,而这两种协议是负责传输层的内容…

组件设计原则

state数据结构设计 用数据描述所有内容数据要结构化,易于程序操作(遍历、查找)数据要可扩展,以便增加新的功能 组件设计组件通讯 从功能上拆分层次尽量让组件原子化容器组件(只管理数据)& UI组件&am…

【MySQL】库操作,数据类型

目录 MySQL简介SQL语句分类库操作语句展示数据库创建数据库使用数据库删除数据库 数据类型整型浮点型字符串日期类型 MySQL简介 数据库有关系型数据库和非关系型数据库。 关系型数据库:是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就…

科普文:JUC系列之ConcurrentLinkedQueue非阻塞队列用法

概叙 **Queue接口与List、Set同一级别,都是继承了Collection接口**。队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素,队列以一种先进先出的方式管理数据。 队列分为两种&#…

pikachu漏洞平台~文件包含漏洞

在PHP程序中使用文件包含的对象可以被前端的用户控制且没有经过过滤或严格的定义,用户可以将其他的文件作为参数带入到PHP代码中解释执行,从而造成敏感信息泄露/程序文件读取/GetShell等危害的漏洞。 0x01文件包含漏洞 连接成功,完毕&#x…

聚焦IOC容器刷新环节postProcessBeanFactory(BeanFactory后置处理)专项

目录 一、IOC容器的刷新环节快速回顾 二、postProcessBeanFactory源码展示分析 (一)模版方法postProcessBeanFactory (二)AnnotationConfigServletWebServerApplicationContext 调用父类的 postProcessBeanFactory 包扫描 …

oracle(19c)用户管理

简介 本文介绍 Oracle 中的用户管理,包含以下内容: 概念介绍 系统用户 解锁 hr 用户 创建用户 用户相关案例 使用 Profile 管理用户口令 Oracle 的认证方式 重置管理员(sys)密码 1. 概念介绍 使用前可以自行安装oracle数据库 oracle19c安装&a…

【系统架构设计师】二十四、安全架构设计理论与实践④

目录 六、数据库系统的安全设计 6.1 数据库的完整性设计 6.1.1 数据库完整性设计原则 6.1.2 数据库完整性的作用 6.1.3 数据库完整性设计示例 七、系统架构的脆弱性分析 7.1 软件脆弱性的特点和分类 7.2 软件脆弱性的生命周期 7.2.1 脆弱性的引入阶段 7.2.2 产生破坏…