桥接模式的学习

保姆级教程:用微信小程序+OneNet MQTT API,5分钟搞定温湿度数据实时展示 本文提供了一份详细的教程,教你如何利用微信小程序和OneNet MQTT API在5分钟内实现温湿度数据的实时展示。从OneNet平台配置到小程序数据绑定,手把手指导零基础开发者快速搭建监控系统,涵盖API调用、数据解析和界面设计等关键步骤。 阅读详情

手机操作问题:

​  现在不同的手机会装载不同的系统来实现操作(开机、关机)

  eg:

​   手机

​     小米 -> MIUI

​     OPPO->COLORS

​     ONEPLUS ->COLORS/H2OS

​     …

 

传统方案解决手机操作问题

在这里插入图片描述

​ 存在问题:

​   1.拓展问题,容易类爆炸。即当我们需要添加新品牌,及其以下的系统时,则就要新建相对的类。

​   2.违反了单一职责原则,当我们添加一个手机品牌时,可能会有增加许多的系统。增加了代码维护成本。

 

桥接模式

 将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。
 
抽象部分与实现部分

   抽象部分 是一些实体的高阶控制层。 该层自身不完成任何具体的工作, 它需要将工作委派给实现部分层 (也被称为平台)。

   在实际的程序中, 抽象部分是图形用户界面 (GUI), 而实现部分则是底层操作系统代码 (API), GUI 层调用 API 层来对用户的各种操作做出响应。

  一般来说, 你可以在两个独立方向上扩展这种应用:

  开发多个不同的 GUI (例如面向普通用户和管理员进行分别配置)
  支持多个不同的 API (例如, 能够在 Windows、 Linux 和 macOS 上运行该程序)。

  该模式建议将类拆分为两个类层次结构:

  抽象部分: 程序的 GUI 层。
  实现部分: 操作系统的 API。

  抽象对象控制程序的外观, 并将真实工作委派给连入的实现对象。 不同的实现只要遵循相同的接口就可以互换, 使同一 GUI 可在 Windows 和 Linux 下运行。

最后的结果是: 你无需改动与 API 相关的类就可以修改 GUI 类。 此外如果想支持一个新的操作系统, 只需在实现部分层次中创建一个子类即可。

 

桥接模式结构

在这里插入图片描述  1.抽象部分 (Abstraction)提供高层控制逻辑, 依赖于完成底层实际工作的实现对象。

 2.实现部分 (Implementation) 为所有具体实现声明通用接口。 抽象部分仅能通过在这里声明的方法与实现对象交互。

抽象部分可以列出和实现部分一样的方法, 但是抽象部分通常声明一些复杂行为, 这些行为依赖于多种由实现部分声明的原语操作。

 3.具体实现 (Concrete Implementations) 中包括特定于平台的代码。

 4.精确抽象 (Refined Abstraction) 提供控制逻辑的变体。 与其父类一样, 它们通过通用实现接口与不同的实现进行交互。

 5.通常情况下,客户端 (Client)仅关心如何与抽象部分合作。 但是, 客户端需要将抽象对象与一个实现对象连接起来。

桥接模式适合应用场景

 1.如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。

 2.如果你希望在几个独立维度上扩展一个类, 可使用该模式。

 3.如果你需要在运行时切换不同实现方法, 可使用桥接模式。
 

实现方式

 1.明确类中独立的维度。 独立的概念可能是: 抽象/平台, 域/基础设施, 前端/后端或接口/实现。

 2.了解客户端的业务需求, 并在抽象基类中定义它们。

 3.确定在所有平台上都可执行的业务。 并在通用实现接口中声明抽象部分所需的业务。

 4.为你域内的所有平台创建实现类, 但需确保它们遵循实现部分的接口。

 5.在抽象类中添加指向实现类型的引用成员变量。 抽象部分会将大部分工作委派给该成员变量所指向的实现对象。

 6.如果你的高层逻辑有多个变体, 则可通过扩展抽象基类为每个变体创建一个精确抽象。

 7.客户端代码必须将实现对象传递给抽象部分的构造函数才能使其能够相互关联。 此后, 客户端只需与抽象对象进行交互, 无需和实现对象打交道。
 

桥接模式优缺点

 优点:
  ✔️你可以创建与平台无关的类和程序。
  ✔️客户端代码仅与高层抽象部分进行互动, 不会接触到平台的详细信息。
  ✔️开闭原则。 你可以新增抽象部分和实现部分, 且它们之间不会相互影响。
  ✔️单一职责原则。 抽象部分专注于处理高层逻辑, 实现部分处理平台细节。

 缺点:
 ❌对高内聚的类使用该模式可能会让代码更加复杂。

 

更改后的手机操作问题:

​在这里插入图片描述

代码:

public interface OS {
    void open();
    void close();
    void call();
}
public class Phone {
    private OS os;

    public Phone(OS os){
        super();
        this.os = os;
    }

    protected void open(){
        this.os.open();
    }

    protected void close(){
        this.os.close();
    }

    protected void call(){
        this.os.call();
    }
}
public class MIUI implements OS {
    @Override
    public void open() {
        System.out.println("MIUI opening...");
    }

    @Override
    public void close() {
        System.out.println("MIUI choseing...");
    }

    @Override
    public void call() {
        System.out.println("MIUI calling...");
    }
}

public class H2OS implements OS {
    @Override
    public void open() {
        System.out.println("H2OS opening...");
    }

    @Override
    public void close() {
        System.out.println("H2OS choseing...");
    }

    @Override
    public void call() {
        System.out.println("H2OS calling...");
    }
}
public class XIAOMI extends Phone {
    public XIAOMI(OS os) {
        super(os);
    }

    protected void open(){
        System.out.print("XIAOMI-");
        super.open();
    }

    protected void close(){
        System.out.print("XIAOMI-");
        super.close();
    }

    protected void call(){
        System.out.print("XIAOMI-");
        super.call();
    }
}

public class ONEPLUS extends Phone {
    public ONEPLUS(OS os) {
        super(os);
    }

    protected void open(){
        System.out.print("ONEPLUS-");
        super.open();
    }

    protected void close(){
        System.out.print("ONEPLUS-");
        super.close();
    }

    protected void call(){
        System.out.print("ONEPLUS-");
        super.call();
    }
}
public class Client {
    public static void main(String[] args) {
        //小米手机搭载MIUI
        Phone xiaomi_miui = new XIAOMI(new MIUI());
        xiaomi_miui.open();
        xiaomi_miui.call();
        xiaomi_miui.close();

        System.out.println("-----");
        //一加搭载H2OS
        Phone oneplus_h2os = new ONEPLUS(new H2OS());
        oneplus_h2os.open();
        oneplus_h2os.call();
        oneplus_h2os.close();

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

        //小米手机搭载H2OS
        Phone xiaomi_h2os = new XIAOMI(new H2OS());
        xiaomi_h2os.open();
        xiaomi_h2os.call();
        xiaomi_h2os.close();

    }
}

 
注意:

​  1.实现了抽象和实现的分离,从未极大的提供了系统灵活性。让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从未产生更好的结构化系统。

​  2.对于系统的高层部分,便只需知道抽象部分和实现部分的接口即可,其他部分由具体业务来完成。

​  3.桥接模式用来替代多层继承方案,可以减少子类的个数,降低系统的管理与维护。

​  4.但桥接模式的引入增加了系统的理解和设计难度,因为聚合关联建立在抽象层,因此开发时要针对抽象进行设计。

适用的应用场景:

​  1)JDBC驱动程序

​  2)银行转正系统

​    分类:网上,柜台,AMT

​    类型:普通用户、银卡用户、金卡用户

​  3)消息管理

​    类型:即时消息、延时消息

​    分类:短信、邮件、通讯软件

​

Jenkins部署前后端分离项目最全图文教程(手把手教学) 最近Jenkins部署的热度比较高,于是就想出一篇关于我是如何使用Jenkins部署前后端分离项目的,本篇记录了我是如何一步一步去配置、搭建和部署的完整流程,每一行代码都进行了实测和讲解,通过图文的教学写成博客分享给大家! 阅读详情

相关推荐

Jupyter Notebook 命名出现“error”且运行后没反应

Jupyter Notebook 命名出现“error”且运行后没反应提前声明错误截图(方便大家看看是不是自己的错误)解决方法 提前声明 我的问题是在看到答主 @开始King的回答后才解决的,因为答主大大的文章后面有些地方不是很详细,我在这里再在King大大的基础上完善一下子 错误截图(方便大家看看是不是自己的错误) 1.命名失败,上面出现一个“error”字样 2.运行失败,无论是点击上方的运行按钮还是按快捷键shift+enter 都只会向下再增加一个代码块,而不会运行程序。 (也不是很多人出现的[*

qq_52770743的博客 1万+

进阶学习(3.9) Bridge Pattern 桥接模式

1, 什么是桥接 桥, 提供给两方, 或者多方相交汇的作用, 例如, A 函数想调用 B 函数, 常见的方法就是, 直接在A 中显式 调用B, 这样存在高耦合, 如果我们使用一个中间函数C, 在C里面显调用A, 再调用B, 像是这样 1.1 A -> B 1.2 C -> A -> B A B 耦合就解开了, 1.3 更抽象的理解使用, 比如从数据库里面的数据, 怎么就变成了 Java 中的对象呢? 这中间肯定就有桥接模式的使用, 有很多很多的...

BIG.KE的博客 277

上下文理解的AI增强方案:AI应用架构师的架构洞察

本文将从AI应用架构师的视角,深入探讨“上下文理解”的技术本质、核心挑战,以及一套可落地的上下文增强架构方案。我们会拆解上下文理解的底层需求,分析架构设计中的关键决策,并通过具体案例展示如何构建一个能“记住过去、理解现在、预测未来”的AI系统。三个维度:上下文的内容范围(短期/中期/长期)、数据类型(文本/结构化/多模态)、技术挑战(窗口限制/信息过载/跨会话一致性);三种架构模式:分层上下文存储(热/冷数据分离)、上下文路由(按需筛选)、动态压缩(适配模型窗口);四个关键组件。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 220

设计模式学习笔记十二:桥接模式(Bridge Pattern)

设计模式学习笔记十二:桥接模式(Bridge Pattern)     1.概述     桥接模式(Bridge),将抽象部分与它的实现部分分离,是他们都可以独立的变化。什么叫抽象与它的实现分离,这并不是说,让抽象类与其他派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。     下面我们看桥接模式的结构图:     (1).Abs

AlbenXie的博客 610

避坑指南:PyCINRAD处理CINRAD雷达数据时遇到的5个典型报错及解决方案

本文针对使用PyCINRAD库处理CINRAD雷达基数据时常见的5个典型报错,提供了详细的解决方案。内容涵盖环境配置、数据读取、PPI可视化及性能优化等核心环节,重点解决了版本兼容性、数据异常处理和中文乱码等实际问题,帮助用户高效处理雷达基数据并生成准确的PPI图像。

cc789的博客 1068

文华财经公式编程:麦语言简介及基础语法

文华财经公式语言(麦语言)是一种专门用于金融领域的编程语言,它是由文华财经公司开发的。提供了丰富的金融计算函数和数据处理功能,可以用于金融市场的数据分析、模型建立和交易策略的开发。例1:A:CLOSE;// 定义变量A为收盘价(盘中k线没有走完的时候A为最新价)。例2:MA5:=MA(C,5);// 定义收盘价的5周期均线(C为CLOSE简写)。例3:A:=REF(C,1);// 取得前一根k线的收盘价。

超哥量化的博客 1万+

设计模式学习总结-桥接模式(Bridge Pattern)

问题:在面向对象的设计中,抽象是一个很重要的概念,所谓抽象就是忽略一类对象的特殊特性,提出一些共有的特性,暂时忽略一些细节,而对与此类对象的变化可以使用继承的手段在子类中完成,换言之,用继承来应对抽象的变化。在软件系统中,当抽象由于某种原因也容易变动,使得对象从两个维度或更多方向上发生改变。使用继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比继承...

weixin_34037977的博客 93

基于simulink的智能驾驶领域--智能车道保持辅助系统仿真

LKAS通过摄像头等传感器检测车辆相对于车道线的位置,并自动调整转向,以帮助驾驶员保持在车道内行驶。将摄像头传感器模块的输出连接到车道线检测模块的输入端口,再将车道线检测模块的输出连接到转向控制器模块的输入端口,最后将转向控制器模块的输出连接到车辆动力学模型的转向输入端口,形成闭环控制系统。上升时间是指系统从初始转向角上升到目标转向角所需的时间,调节时间是指系统进入并保持在目标转向角一定范围内的所需时间。该控制器将根据摄像头传感器的数据调整车辆的转向角,以保持车辆在车道内行驶。

xiaoheshang_123的博客 162

认真学习设计模式之桥接模式(Bridge Pattern)

# 【1】概述 桥接模式(Bridge 模式)是一种结构型设计模式,是指将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。 Bridge 模式基于类的`最小设计原则`,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(`Abstraction`)与行为实现(`Implementation`)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。 **UML类图** ![在这里插入图片描述](https://img-blog.csdnimg.cn/c3bc0

小小默:进无止境 1223

Openclaw第3章:进阶部署

本章面向需要在特定环境中稳定运行 OpenClaw 的用户,介绍 Windows、Linux、Docker 以及 Cloudflare Workers 四种进阶部署方式。每种方式各有侧重:Windows 部署适合桌面用户日常使用,Linux 部署适合开发者,Docker 部署适合追求环境隔离的运维场景,Cloudflare Workers 部署则适合希望获得全球边缘网络加速的用户。读者可根据自身环境和需求选择合适的方案,完成本章后可继续阅读第4章了解维护升级流程。

Maynor的博客 1295

RAG效果调优清单(命中率提升3倍)

本文提出了一套工程可落地的RAG(检索增强生成)模型组合方案,强调通过最优组合实现效果、成本和扩展性的平衡。核心架构包括Embedding模型、向量数据库检索、Rerank模型和LLM生成四个环节,推荐了四种具体组合方案:本地最优性价比(bge+reranker+Qwen 7B)、效果优先(bge-large+reranker+14B模型)、高并发(轻量模型+vLLM)和中英混合(多语言模型)。文章指出Embedding决定检索下限,Rerank提升准确率上限,LLM影响最终体验,并提供了不同场景的优化策略

刘一说的IT专栏 522

桥接模式学习

桥接模式

yjwandroid的博客 193

2026年算法工程师常见面试简答题

本文摘要:文章系统梳理了机器学习与深度学习中的30个核心概念,涵盖模型优化、评估指标、经典算法和大模型应用等关键知识点。主要内容包括:1)过拟合与欠拟合的成因及解决方法;2)偏差-方差权衡原理;3)数据划分与交叉验证策略;4)分类/回归任务评估指标选择;5)逻辑回归、决策树、SVM等传统算法解析;6)梯度下降优化与正则化技术;7)CNN、RNN、Transformer架构对比;8)Embedding表示与RAG技术。特别强调面试高频考点如XGBoost改进、注意力机制原理等,并给出实际工程中的解决方案建议,

不务正业的猿 350

桥接模式学习总结

桥接模式 引言 假如一个系统需要加入报表模块,主要的开发点是数据的获取和报表的显示方式。数据的获取可能是从系统数据库中读取数据,也可能是从Excel文件中读取数据,还可以是通过接口获取数据等。报表的显示方式也繁多,比如用柱状图显示,用表格显示,用折线图显示等。如果对每一种情况都设计一个类,那么要实现该系统需要的类的数量是非常庞大的(数据的获取方式*报表显示方式)。那么如何设计这样的系统呢?本文...

江川的博客 1030

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Linux学习】桥接模式

桥接模式 vmvare在安装的时候默认安装了两块虚拟网卡,VMnet1和VMnet8,另外还有VMnet0,VMnet0对应的就是桥接模式的网卡。 就是将主机网卡和虚拟机虚拟的网卡利用虚拟网桥进行通信,在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有的桥接设置的虚拟机连接到这个交换机的一个接口上,所有桥接模式下的网卡与网卡都是交换模式的,相互可以访问而互不干扰。虚拟机和主机处于同等的地位...

fxkcsdn的博客 690

精雕软件(JDpaint) 5.5 绿色版

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

学习设计模式——桥接模式

桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立地变化 使用组合关系代替继承关系,降低抽象和实现两个可变纬度的耦合度 // 用桥接模式 实现工厂生产洗衣机的不同型号 // 组装洗衣机 function Washer(motorType, rollerType, transducerType) { this.motor = new Motor(motorType); this...

逆水行舟,不进则退 400

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

七个结构型模式2:桥接模式-Bridge Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】

问题引入: Sunny软件公司欲开发一个跨平台图像浏览系统,要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、Unix等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。系统需具有较好的扩展性以支持新的文件格式和操作系统。 桥接模式是

JackZhangNJU的专栏 677

python桥接模式学习

桥接模式 当你希望在多个对象之间共享实现时,使用桥接模式是一个好主意 桥接模式与适配器模式有相似之处,都是对不同对象之间的模式 适配器模式强调的是如何使不同对象协同工作,属于后期实现,桥接模式能够预先以解耦的方式定义抽象及其实现,属于预期实现。 实现 定义抽象接口,维护一个实现者(需要为帮助获取内容的实现类定义接口)的对象引用 为获取内容的实现类定义接口:python使用元类和抽象基类(ABC)定义等价的接口 实现实现者接口并定义其具体实现 主函数调用: 获取实现类对象 获取抽象接口对象,将实现类对

奔跑的蜗牛的博客 314

java设计模式学习之【桥接模式】

这篇教程不仅提供了桥接模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1705
上一篇: 适配器模式
下一篇: 装饰者模式
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值