23种设计模式-桥接(Bridge)设计模式

桥接设计模式

  • 🚩什么是桥接设计模式?
  • 🚩桥接设计模式的特点
  • 🚩桥接设计模式的结构
  • 🚩桥接设计模式的优缺点
  • 🚩桥接设计模式的Java实现
  • 🚩代码总结
  • 🚩总结

🚩什么是桥接设计模式?

桥接模式(Bridge Pattern)结构型设计模式,它将 抽象部分实现部分 分离,使它们可以 独立变化。桥接模式通过 组合 而不是继承来实现抽象与实现的解耦。

使用场景

  • 当需要 避免抽象与实现之间的永久绑定 时。

  • 抽象部分实现部分 都需要 独立扩展 时。

  • 当需要 在运行时切换实现 时。

🚩桥接设计模式的特点

  • 分离抽象与实现:桥接模式将抽象部分与实现部分分离,使它们可以独立变化。

  • 灵活性:抽象部分和实现部分可以独立扩展,互不影响。

  • 可扩展性:新增抽象或实现时,无需修改现有代码。

  • 解耦:通过组合关系替代继承关系,降低系统的耦合度。

🚩桥接设计模式的结构

桥接模式主要包含以下部分:

  • Abstraction(抽象部分):定义抽象接口,并维护一个对 实现部分 的引用。

  • RefinedAbstraction(扩展抽象部分):对抽象部分进行扩展,提供更多的功能。

  • Implementor(实现部分接口):定义实现部分的接口,供抽象部分调用。

  • ConcreteImplementor(具体实现部分):实现 Implementor 接口,提供具体的实现。

🚩桥接设计模式的优缺点

✅ 优点

  • 分离抽象与实现:抽象部分和实现部分可以独立变化,互不影响。

  • 灵活性:可以在运行时动态切换实现。

  • 可扩展性:新增抽象或实现时,无需修改现有代码。

  • 解耦:通过组合关系替代继承关系,降低系统的耦合度。

❌ 缺点

  • 增加复杂性:桥接模式引入了更多的类和对象,增加了系统的复杂性。

  • 设计难度:需要正确识别抽象部分和实现部分,设计难度较高。

🚩桥接设计模式的Java实现

代码地址:GitHub

  • 首先创建实现部分接口Color,定义方法 OperationImp()
/*** @author hanson.huang* @version V1.0* @InterfaceName Color* @Description 实现部分接口 Color* @date 2025/3/24 10:46**/
public interface Color {public void OperationImp(String name);
}
  • 创建 抽象产品类Product,定义抽象方法 Operation(),并维护一个对 接口Color 的引用。
/*** @author hanson.huang* @version V1.0* @ClassName Product* @Description 产品抽象类* @date 2025/3/24 10:40**/
public abstract class Product {private String name;protected Color color;public void setName(String name) {this.name = name;}public String getName() {return name;}public void setColor(Color color) {this.color = color;}public abstract void Operation();
}
  • 创建 扩展抽象部分 ProductA,实现 Operation() 方法,调用 实现部分 的方法。
/*** @author hanson.huang* @version V1.0* @ClassName ProductA* @Description 扩展抽象部分 ProductA* @date 2025/3/24 10:48**/
public class ProductA extends Product {@Overridepublic void Operation() {color.OperationImp(this.getName());}
}
  • 创建 具体实现部分 Red 和 Blue,分别实现 OperationImp() 方法。

    • Red
    /*** @author hanson.huang* @version V1.0* @ClassName Red* @Description 具体实现部分 Red* @date 2025/3/24 10:49**/
    public class Red implements Color {@Overridepublic void OperationImp(String name) {System.out.println(name + ":红色");}
    }
    
    • Blue
    /*** @author hanson.huang* @version V1.0* @ClassName Blue* @Description 具体实现部分 Blue* @date 2025/3/24 10:49**/
    public class Blue implements Color {@Overridepublic void OperationImp(String name) {System.out.println(name + ":蓝色");}
    }
    
  • 测试桥接模式

/*** @author hanson.huang* @version V1.0* @ClassName BridgePattern* @Description 测试桥接模式* @date 2025/3/24 10:59**/
public class BridgePattern {public static void main(String[] args) {Product productA1 = new ProductA();Product productA2 = new ProductA();Red red = new Red();productA1.setName("产品A1");productA1.setColor(red);productA1.Operation();Blue blue = new Blue();productA2.setName("产品A2");productA2.setColor(blue);productA2.Operation();}
}

📌 运行结果

在这里插入图片描述

🚩代码总结

  • 抽象部分 Product 定义抽象方法 Operation(),并维护一个对 实现部分 Color 的引用。

  • 扩展抽象部分ProductA实现 Operation() 方法,调用 实现部分 的方法。

  • 实现部分接口Color定义方法 OperationImp()

  • 具体实现部分 RedBlue 分别实现 OperationImp() 方法。

🚩总结

  • 桥接模式(Bridge Pattern)抽象部分实现部分 分离,使它们可以 独立变化

  • 适用于 避免抽象与实现之间的永久绑定独立扩展抽象与实现在运行时切换实现 的场景。

  • Java 实现 需要 定义抽象部分实现部分接口 以及 具体实现部分,并通过组合关系将两者连接起来。

✅ 适用场景:

  • 需要 避免抽象与实现之间的永久绑定 时。

  • 需要 独立扩展抽象与实现 时。

  • 需要 在运行时切换实现 时。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

在这里插入图片描述

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

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

相关文章

python:music21 构建 LSTM+GAN 模型生成爵士风格音乐

keras_lstm_gan_midi.py 这是一个结合 LSTM 和 GAN 生成爵士风格音乐的完整Python脚本。这个实现包含音乐特征提取、对抗训练机制和MIDI生成功能: import numpy as np from music21 import converter, instrument, note, chord, stream from tensorflow.keras.mode…

go:前后端分离

1.前端代码 新建一个前端文件夹,在该文件夹下新建一个.html文件,写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下: func main() { // 服务运行提示 fmt.Println("go web server is runn…

大数据学习(86)-Zookeeper去中心化调度

🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南,你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…

HTML5 拖放(Drag and Drop)学习笔记

一、HTML5 拖放简介 HTML5 拖放(Drag and Drop)是HTML5标准的一部分,允许用户抓取一个对象并将其拖动到另一个位置。拖放功能在现代网页中非常常见,例如文件上传、任务管理、布局调整等场景。 HTML5 拖放功能支持以下浏览器&…

文件I/O--C++的文件操作

一、打开文件&#xff0c;从文件中读取、写入文件 从文件中读取数据&#xff1a; #include<fstream> //fstream File stream:文件流 #include<iostream> //fstream包含了 iostream&#xff0c;所以这句可以省略&#xff0c;现在不能了 using namespace std;i…

Redis GEO 命令详解:轻松实现“附近的人“功能

目录 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令详解 命令应用示例 添加地点信息 查询两地距离 查询附近的城市 实现"查找附近的人"功能 功能需求与实现思路 基本需求 实现思路 命令实现方案 存储用户位置 查询附近的用户 Java代码实…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

NIO入门

IO和NIO的区别&#xff1a; IO&#xff1a;通过流处理数据&#xff0c;仅支持阻塞IO。 核心组件&#xff1a;InputStream /OutputStream用于字节的读写&#xff0c;Reader / Writer&#xff1a;用于字符流的读写。读取过程中无法被中断&#xff0c;是阻塞式IO。 NIO:通过管道处…

基于vue.js开发的家庭装修管理系统开发与设计(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本家庭装修管理系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Node.js语言进行编写&#xff0c;使用了VUE框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户的功能包括&#xff1a;注册、登录、浏览首页…

OpenCV图像拼接(5)图像拼接模块的用于创建权重图函数createWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数&#xff0c;主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…

LangGraph 怎么控制递归次数

这一节我们讲讲langgraph图的递归限制 Recursion Limit&#xff0c;递归限制设置了图在单次执行过程中可以执行的最大超级步骤数。一旦达到该限制&#xff0c;LangGraph 将引发 GraphRecursionError 错误。默认情况下&#xff0c;此值设置为 25 步。递归限制可以在运行时为任何…

08-项目中不可控的任务如何安排和验收

项目中有时会有一些任务的时间是不可控的&#xff0c;不可控的原因在于该工作完全受制于他人。意思就是如果其他人没有做好&#xff0c;比如前后端同步开发&#xff0c;前端通常可能会快一些&#xff0c;然后要等后端提供接口&#xff0c;这个时候联调工作是没办法开展的&#…

【Git】git cherry-pick(将某个分支的 commit 改动复制到当前分支)

文章目录 ‌一、基础用法1.1、‌应用单个提交1.2、‌应用多个非连续提交1.3、‌应用多个连续提交 ‌二、高级用法‌2.1、冲突处理‌2.2、放弃操作‌2.3、‌不自动提交2.4、应用分支的最新提交 ‌一、基础用法 1.1、‌应用单个提交 使用提交的哈希值&#xff08;可通过 git lo…

Milvus WeightedRanker 对比 RRF 重排机制

省流:优先选择WeightedRanker 以rag为例,优先选择bm25全文检索,其次选择向量检索 Milvus混合搜索中的重排机制 Milvus通过hybrid_search() API启用混合搜索功能&#xff0c;结合复杂的重排策略来优化多个AnnSearchRequest实例的搜索结果。本主题涵盖了重排过程&#xff0c;…

C++手撕共享指针、多线程交替、LRU缓存

1. 共享指针 #include <atomic> #include <iostream>template <typename T> class sharedptr { private:T *ptr;std::atomic<size_t> *count;public:sharedptr(T *p) : ptr(p), count(new std::atomic<size_t>(1)) {}sharedptr(const sharedptr…

新版 eslintrc 文件弃用 .eslintignore已弃用 替代方案

1.进入eslint.config.mjs文件 2.import { defineConfig, globalIgnores } from "eslint/config"; 引入globalIgnores 3.配置 defineConfig([ ... globalIgnores([ "config/*", ".husky", ".local", "public/*", ".…

基于ngnix配置本地代理到对应服务器

遇到的问题&#xff1a;服务器可以访问到的地址&#xff0c;我本地代码无法访问到 在服务器上装好nginx&#xff0c;在nginx配置文件nginx.conf中配置本地想要链接对应的服务器端口信息 server {listen 8101;location / {proxy_http_version 1.1;proxy_set_header Upgrade $h…

Go 语言 fmt 模块的完整方法详解及示例

以下是 Go 语言 fmt 模块的完整方法详解及示例&#xff0c;涵盖所有核心功能&#xff1a; 一、输出函数 将数据写入标准输出、文件或字符串。 1. Print / Println / Printf 功能 Print: 写入标准输出&#xff0c;不换行。Println: 写入标准输出并换行。Printf: 格式化写入标…

在K8S中使用ArgoCD做持续部署

一、了解argocd ArgoCD是一个基于Kubernetes的GitOps持续交付工具&#xff0c;应用的部署和更新都可以在Git仓库上同步实现&#xff0c;并自带一个可视化界面。本文介绍如何使用GitArgocd方式来实现在k8s中部署和更新应用服务。关于ci这一块这里不多介绍。主要讲解argocd如何实…