桥接模式(Bridge Pattern)

news/2024/5/8 14:08:46

原文地址:https://jaune162.blog/design-pattern/bridge-pattern.html
更多精彩文章请移步:https://jaune162.blog
更多专题系列文章请移步:https://books.jaune162.blog

序言

桥接模式是一种结构型设计模式,它旨在将抽象部分与实现部分分离,从而使它们可以独立地变化。这种模式通过使用组合而不是继承的方式,可以在抽象和实现之间建立一座桥梁,使得它们可以独立地变化而互不影响。

在桥接模式中,抽象部分包含一个指向实现部分的引用,而实现部分则包含一个指向抽象部分的引用。这种结构使得抽象部分和实现部分可以各自独立地进行扩展和变化,而不会相互影响。

定义

Decouple an abstraction from its implementation so that the two can vary independently.

将抽象与其实现分离,以便二者可以独立变化。

结构

考虑这样一个问题,有一个画图的需求,这个图形有形状和颜色两种属性。起初只有红色正方形,于是定义了一个 RedSquare的类,然后有了蓝色正方形、红色圆形…等需求。随着形状和颜色的添加,类就会越创建也多。

桥接模式

图片来源:https://refactoring.guru/design-patterns/bridge

之所以出现这样的问题,是因为我们再颜色和形状两个维度来扩展类。

在这里插入图片描述

public abstract class Shape {private final String color;private final String shape;protected Shape(String color, String shape) {this.color = color;this.shape = shape;}public void draw() {System.out.println("图形形状:" + shape + ",颜色:" + color + "。");}
}public class RedCircle extends Shape {protected RedCircle() {super("红色", "原型");}
}

怎么办?我们不能够为了新增的需求,无限的创建类。那这时候就需要用到桥接模式了。

Bridge 模式试图通过从继承切换到对象组合来解决这个问题。这意味着将其中一个维度提取到单独的类层次结构中,以便原始类将引用新层次结构的对象,而不是将其所有状态和行为都放在一个类中。

在这里插入图片描述

按照这种方法,我们可以将与颜色相关的代码提取到它自己的类中,其中包含两个子类: Red 和 Blue .然后,该 Shape 类获取指向其中一个颜色对象的引用字段。现在,形状可以将任何与颜色相关的工作委托给链接的颜色对象。该引用将充当 Shape and Color 类之间的桥梁。从现在开始,添加新颜色将不需要更改形状层次结构,反之亦然。

实现

public interface Color {void apply();
}public class Red implements Color {@Overridepublic void apply() {System.out.println("使用了红色");}
}public class Blue implements Color {@Overridepublic void apply() {System.out.println("使用了蓝色");}
}public abstract class Shape {protected final Color color;public Shape(Color color) {this.color = color;}public abstract void draw();
}public class Circle extends Shape {public Circle(Color color) {super(color);}@Overridepublic void draw() {System.out.println("画一个圆形");color.apply();}
}

使用

public class Main {public static void main(String[] args) {Shape shape = new Circle(new Red());shape.draw();Shape shape2 = new Circle(new Blue());shape2.draw();}
}

输出

画一个圆形
使用了红色
画一个圆形
使用了蓝色

这样修改看似与原来的类的数量一致,甚至还多了一个接口。但是随着形状和颜色的增加,类的数量会明显的减少,比如4个形状4个颜色,原来的继承方式需要 4 × 4 = 16 4 \times 4 = 16 4×4=16 而使用桥接模式后只需要 4 + 4 = 8 4+4=8 4+4=8。由原来的指数级增长,改为了常数级的增长。

实际的业务实例

在开源框架中的应用

何时使用

  • 当一个类需要在多个维度上变化时,使用继承会导致类爆炸的问题。
  • 当一个类需要独立地变化其抽象部分和实现部分时。
  • 当需要在抽象部分和实现部分之间建立一种透明的连接关系时。

与其他设计模式的联系

  • 适配器模式(Adapter Pattern):适配器模式旨在解决不兼容接口之间的问题,它通过将一个类的接口转换成客户端所期待的另一个接口,从而使原本不兼容的类可以协同工作。与桥接模式不同,适配器模式是为了使两个不兼容的接口能够协同工作,而桥接模式是为了将抽象部分和实现部分分离,使它们可以独立变化。
  • 装饰器模式(Decorator Pattern):装饰器模式旨在动态地给一个对象添加一些额外的职责,它通过组合的方式来达到这个目的。与桥接模式不同,装饰器模式是为了在不改变接口的情况下给对象添加额外的职责,而桥接模式是为了将抽象部分和实现部分分离,使它们可以独立变化。

虽然桥接模式与适配器模式和装饰器模式有一些相似之处,但它们的目的和应用场景有所不同。桥接模式主要用于将抽象部分和实现部分分离,使它们可以独立变化,从而提高系统的灵活性和可维护性。

总结

通过使用桥接模式,可以更好地管理类之间的关系,提高系统的灵活性和可维护性,同时也有利于解决类爆炸的问题。

参考资料

Bridge

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

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

相关文章

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404解决方法

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404,或者域名后带路径参数刷新就报404 解决方法: 宝塔中站点配置修改:【配置文件】中添加下面代码,具体如图: location / {try_files $uri $uri/ /index.html…

Vue2+ElementUI表单、Form组件的封装

Vue2ElementUI表单、Form组件的封装 :引言 在 Vue2 项目中,ElementUI 的 el-form 组件是常用的表单组件。它提供了丰富的功能和样式,可以满足各种需求。但是,在实际开发中,我们经常会遇到一些重复性的需求&#xff0c…

ChatGPT解决hmm...something seems to have gone wrong.

ChatGPT解决hmm…something seems to have gone wrong. 这里是官方社区的一种workaround办法。仅仅只是mark一下。 我这边遇到的现象是,ChatGPT 3.5是正常的,但是使用ChatGPT 4就会频繁的出现这样的输出。而且恶心的是,即使是这种输出&…

【React】Vite创建React+TS项目

前提条件 有node环境,且node版本>18.0.0 创建项目 npm create vitelatest1.起项目名 2.选择框架 3.选择语言 TypeScript SWC 是指 Vite 使用 SWC(Speedy Web Compiler)作为 TypeScript 的编译器。 SWC 是一个针对 JavaScript 和 Ty…

SpringBoot(依赖管理和自动配置)

文章目录 1.基本介绍1.springboot是什么?2.快速入门1.需求分析2.环境配置1.确认开发环境2.创建一个maven项目3.依赖配置 pom.xml4.文件目录5.MainApp.java (启动类,常规配置)6.HelloController.java (测试Controller&a…

基于springboot实现数据资产管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现数据资产管理系统演示 摘要 固定资产管理系统主要是完成对系统用户管理、资产信息管理、资产变更管理、资产用途管理、资产类别管理和资产增减管理。因为利用本系统管理员可以直接录入信息,修改信息,删除信息,并且若在录入…