java设计模式——桥接模式(Bridge Pattern)

【Java设计模式】Java设计模式之(二十)桥接模式(Bridge Pattern) 本文目录 一、桥接模式介绍 1.1 含义 1.2 适用场景 1.3 主要解决 1.4 应用实例 1.5 优缺点 二、桥接模式实现 2.1 类图 2.2 角色分析 2.3 代码实现 三、源码分析 这种类型的设计模式属于结构型模式。 一、桥接模式介绍 1.1 含义 桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。 桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。 将抽象部分与他的实现部分分离这句话不是很好理解 阅读详情
         设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:
       第一种设计方案是为每一种形状都提供一套各种颜色的版本。
       第二种设计方案是根据实际需要对形状和颜色进行组合。

       对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。

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

结构:
  • Abstraction(抽象类):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,它既可以包含抽象业务方法,也可以包含具体业务方法。
  • RefinedAbstraction(扩充抽象类):扩充由Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。
  • Implementor(实现类接口):定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般而言,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。 Implementor接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅拥有自己的方法,还可以调用到Implementor中定义的方法,使用关联关系来替代继承关系。
  • ConcreteImplementor(具体实现类):具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplementor对象将替换其父类对象,提供给抽象类具体的业务操作方法。

UML图:


模式分析:画完UML图的时候联想到之前写的工厂方法模式有点相似的地方,两个抽象类,然后分别有对应的子类去继承。但是还是有很大的区别,工厂方法模式重在创建对象的方式;桥接模式主要是对一个对象的抽象,然后将这个对象分为抽象部分和实现部分,使得二者独立变化。例如,车这个类型(对应 Abstraction 类),有几种品牌(对应 RefinedAbstraction类),每种品牌继承车这个类,然后车上安装的零件不一样会得到不同的车型,比如引擎,那么这里的引擎可以抽象(对应 Implementor类),具体的引擎型号对应(ConcreteImplementorA或者ConcreteImplementorB).这就是桥接模式。另外这里提个问题,如果将抽象的类(即引擎对应Abstraction,品牌对应Implementor)交换一下合理吗?

代码分析:

public abstract class Engine {
    // 安装引擎
    public abstract void installEngine();
    // 启动引擎
    public abstract void startEngine();
}

public class BenzEngine extends Engine {
    public final String TAG = "BenzEngine";
    @Override
    public void installEngine() {
        Log.d(TAG,"安装奔驰引擎");
    }

    @Override
    public void startEngine() {
        Log.d(TAG,"启动奔驰引擎");
    }
}

public class BWMEngine extends Engine {
    public final String TAG = "BWMEngine";
    @Override
    public void installEngine() {
        Log.d(TAG,"安装宝马引擎");
    }

    @Override
    public void startEngine() {
        Log.d(TAG,"启动宝马引擎");
    }
}



public abstract class Vehicle {
    // 定义一个抽象的引擎
    private Engine engine;
    // 构造函数,有子类定义具体的引擎
    public Vehicle(Engine engine){
        this.engine = engine;
    }
    // 车辆行驶
    public void run(){
        // 每种车型都要安装引擎
        this.engine.installEngine();
        // 然后启动引擎
        this.engine.startEngine();
    }
}

public class SportsCar extends Vehicle{

    public final String TAG = "SportsCar";
    public SportsCar(Engine engine) {
        super(engine);
    }
    @Override
    public void run() {
        super.run();
        Log.d(TAG,"跑车在行驶。。。");
    }
}

public class Tractor extends Vehicle {

    public final String TAG = "Tractor";
    public Tractor(Engine engine) {
        super(engine);
    }

    @Override
    public void run() {
        super.run();
        Log.d(TAG,"拖拉机在飞快行驶。。。");
    }
}

客户端调用:
// 安装宝马引擎的跑车
SportsCar sportsCar = new SportsCar(new BWMEngine());
// 正在行驶
sportsCar.run();

// 安装奔驰引擎的拖拉机,要飞了。。。
Tractor tractor = new Tractor(new BenzEngine());
// 行驶
tractor.run();


优点:
  • 分离抽象接口及其实现部分。
  • 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 实现细节对客户透明,可以对用户隐藏实现细节。

缺点:
  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进 行设计与编程。桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

适用环境:
  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
  • 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

扩展:
适配器模式与桥接模式的联用:
  • 桥接模式和适配器模式用于设计的不同阶段,桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色, 使它们可以分别进行变化;而在初步设计完成之后,当发现系统与已有类无法协同工作时,可以采用适配器模式。但有时候在设计初期也需要考虑适配器模式, 特别是那些涉及到大量第三方应用接口的情况。
设计模式之桥接模式BridgePattern 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 立即下载

相关推荐

单节锂电池充电管理芯片应用原理阐述及应用领域

当电池电压超过2.9V时,采用恒流模式对电池充电,充电电流由PROG 管脚和GND之间的电阻RPROG确定。充电电压固定于4.2V,而充电电流可通过一个电阻器进行外部设置当充电电流在达到最终浮充电压之后降至设定值1/10时,WD4054将自动终止充电循环。在待机模式中,WD4054 对 BAT 引脚电压进行监控,只有当 BAT 引脚电压低于再充电阈值电压4.1V时(对应电池容量80%~90%),才会开始新的充电循环,重新对电池进行充电,这就避免了对电池进行不必要的反复充电,有效延长电池的使用寿命。

weixin_41141180的博客 941

Android Develop

一:Android 4大组件1:Activity1.1:Activity 启动模式activity/├── HelloWorldActivity.java├── launchmode│   ├── ActivityCollector.java│   ├── LaunchModeActivity.java│   ├── SingleTaskActivity.java│   ├── SingleTop...

gonghuixue的博客 447

白话详细解读(七)----- CBAM:Convolutional Block Attention Module

一、CBAM简介 论文链接:https://x.sci-hub.org.cn/scholar?hl=zh-TW&as_sdt=0%2C5&q=CBAM%3A+Convolutional+Block+Attention+Module&btnG=&oq=CB CBAM这篇论文是在2018年提出的,自提出之后,已经被引用上千次,可见其影响力。CBAM是一种专门为了卷积神经网络而设计的注意力模块,传统的卷积存在只关注局部信息,而往往忽略全局信息的弊端,以3*3卷积为例,滤波器有9个

奋斗の博客 1万+

adb命令

# 查看设备 adb devices # 进入指定的设备 adb -s <some> shell adb shell # 获取安卓版本 getprop ro.build.version.release # 获取设备型号 getprop ro.prodect.model # 获取产商名称 getprop ro.product.brand # 获取序列号 getprop ro.serialno # 获取系统api版本 getprop ro.build.version.sdk adb

、moddemod 1360

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1144

FPGA经验谈系列文章——3、逻辑级数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA开发tips系列——前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的

gzy0506的博客 1万+

设计模式-桥接模式

结构型设计模式结构型模式主要总结了一些类和对象组合在一起的经典结构,这些经典结构可以解决对应特定场景的问题.一共包括七种:代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。

hey_lie的博客 375

基于YOLOv13+CBAM注意力机制

本教程详细介绍了CBAM注意力机制的原理及其在YOLOv13中的集成方法。CBAM通过通道注意力和空间注意力两个模块,动态调整特征权重以增强模型性能。通道模块利用池化操作和共享MLP生成通道权重,空间模块则通过池化和卷积生成空间权重。教程提供了在YOLOv13中实现CBAM的具体步骤,包括模块代码定义、模型配置修改等关键环节,帮助开发者在目标检测任务中提升模型表现。

FJN110的博客 305

windows下载安装adb(极其简单)

单独安装adb,不安装sdk 下载adb Google很好的心,直接放出ADB的档案供人下载。下档路径如下: Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip Linux版本:https://dl.google.com/andro

x2584179909的博客 46万+

Abaqus数据导出技巧:轻松处理大量XY数据

通过上述三种方法,我们可以解决Abaqus中大量XY数据导出的问题。无论是使用插件、编写Python脚本,还是利用Abaqus的内置报告功能,都可以帮助我们高效地处理数据。希望这篇博客能够帮助到你,提高你在Abaqus使用过程中的数据处理效率。

m0_62153576的博客 1915

YOLOv8 架构改造实战:添加 P2 小目标检测头与 P6 超大目标检测头

上采样是指将特征图的空间尺寸变大(例如从 20×20 → 80×80),用来提升图像的分辨率。常见于解码器结构或特征融合中。下采样是指将特征图的空间尺寸缩小(例如从 256×256 → 128×128),通常用于减少计算量、提取更高级语义特征。操作目的方法尺寸变化上采样放大特征图插值算法变大(如2×)下采样压缩特征图、提取语义stride卷积等变小(如1/2)

FJN110的博客 572

【官方】下载最新adb及安装驱动的方法

Only adb: 驱动:https://adbdriver.com/downloads/ adb工具:https://adbshell.com/upload/adb.zip https://adbshell.com/downloads Google官方platform_tool工具(包含adb) 下载 下载:https://developer.android.com/studio/releases/platform-tools ADB和Fastboot for Windows htt.

u013463707的专栏 12万+

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6652

Java 设计模式之桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern)是一种用于将抽象部分与其实现部分分离的结构型设计模式。这种模式通过组合关系而不是继承关系来连接抽象与实现,使代码更具扩展性和维护性。桥接模式的核心思想是将抽象和实现解耦,使得两者可以独立变化。桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与其实现部分分离,从而使两者可以独立地变化。桥接模式通过组合关系代替继承关系,将抽象和实现解耦,使代码更具扩展性和维护性。

微笑听雨 2836

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JAVA设计模式之 桥接模式【Bridge Pattern】

一、概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式。二、适用场景 处理多维度变化。 业务场景:某功能为将数据库中的数据转换成多种文件格式,例如txt、xml、pdf等格式,同时需要支持多种不同类型的数据库的读取。便可使用桥接模式对其进行设计。 这里的维度有两个 分别为:不同的文件格式

小吕丶Code阶区 5241

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java设计模式——桥接模式【Bridge Pattern】

Java设计模式、桥接模式、Bridge Pattern

scorpio的博客 1796

Java设计模式 九 桥接模式 (Bridge Pattern)

定义设备的通用操作接口。

空 1168

java设计模式---桥接模式(Bridge pattern)

java设计模式—桥接模式(Bridge pattern) 桥接模式是结构型设计模式之一,也称为桥梁模式。桥接模式(Bridge)是为了解决将抽象部分与实现部分分离,好让他们都在自己的维度上有多维度地变化。 1. 定义 将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化。从模式的定义上来看,我们可以知道,这里的桥梁指的就是连接抽象类与实现类...

渔潭的博客 437

java bridge 模式_JAVA设计模式之 桥接模式【Bridge Pattern】

1、概述将抽象部份与它的实现部份分离,使它们都可以独立地变化。它是1种对象结构型模式,又称为柄体(Handle and Body)模式。2、适用处景处理多维度变化。业务场景:某功能为将数据库中的数据转换成多种文件格式,例如txt、xml、pdf等格式,同时需要支持多种不同类型的数据库的读取。即可使用桥接模式对其进行设计。这里的维度有两个 分别为:不同的文件格式 和 不同的数据库类型。以下图:3、U...

weixin_32893479的博客 347

Java 设计模式之桥接模式,Java 桥接模式 ,java Bridge Pattern

Java 设计模式之桥接模式 Java 桥接模式 java Bridge Pattern ================================ ©Copyright 蕃薯耀2021-07-05 https://blog.youkuaiyun.com/w995223851 一、桥接模式(Bridge Pattern) 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 ..

蕃薯耀的博客 168

设计模式 · 桥接模式(Bridge Pattern)java

文章摘要: 桥接模式是一种解决多维度变化的优雅方案。文章以支付场景为例,展示了传统if-else硬编码方式(6种组合)与桥接模式(5个类)的对比。桥接模式通过将支付渠道(微信/支付宝)与支付模式(密码/刷脸/指纹)两个维度解耦,使用组合代替继承,避免了类数量爆炸。核心是在抽象类中持有实现接口引用,通过构造注入实现灵活组合。文中详细展示了架构图、时序图和代码实现,证明桥接模式能显著提升系统扩展性,新增渠道或模式只需添加对应类,无需修改既有代码。

qq_61875563的博客 487

java设计模式之桥接模式(bridge pattern)

在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。 当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果...

heidou_2016的博客 308

Java设计模式-桥接模式(Bridge Pattern)

业务抽象和业务实现,实现类间的类间解耦。

qq_37400096的博客 662

java设计模式 不同数据库_JAVA设计模式之 桥接模式【Bridge Pattern】

一、概述将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式。二、适用场景处理多维度变化。业务场景:某功能为将数据库中的数据转换成多种文件格式,例如txt、xml、pdf等格式,同时需要支持多种不同类型的数据库的读取。便可使用桥接模式对其进行设计。这里的维度有两个 分别为:不同的文件格式 和 不同的数据库类型。如下图:三、U...

weixin_32248531的博客 486

(10)Java设计模式 - 桥接模式(Bridge Pattern)

简单来讲,桥接模式是一个两层的抽象。桥接模式是用于“把抽象和实现分开,这样它们就能独立变化”。 桥接模式使用了封装、聚合,可以用继承将不同的功能拆分为不同的类。1、桥接模式的故事电视和遥控器(图中有错字)是一个完美展示两层抽象的例子。你有一个电视机的接口,还有一个遥控器的抽象类。我们都知道,将它们中任何一个定义为一个具体类都不是好办法,因为其它厂家会有不同的实现方法。 2、桥接模式Java示例

潘建南的博客 906
上一篇: java设计模式——适配器模式(Adapter Pattern)
下一篇: java设计模式——组合模式(Composite Pattern)
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值