桥接模式解密:跨越鸿沟,桥接抽象与实现

news2024/11/18 12:27:56

一、概要

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独⽴的变化。其核心思想就是解耦,在面向对象编程中,抽象和实现是通过继承关系来实现的,但这种关系是静态的,不能在运行时动态改变,而桥接模式是通过组合关系来取代继承关系,从而实现抽象部分和实现部分之间的解耦,提高系统的灵活性和可维护性。对应现实生活,它把事物的两个维度分离,使得这两个维度可以独立的变化,维度之间可以灵活的组合。

比如生活中的支付场景,要完成一次支付,首先你要考虑使用哪种支付平台,用微信支付还是支付宝支付。选定平台后,如何去支付,是用密码支付,还是指纹支付。在这种场景下,支付平台和支付方式就是事物的两个维度,分别对应抽象层和实现层,这两个维度可以独立变化,独立扩展。最后通过一个桥接结构将两个维度进行关联,所有的支付情景就是两个维度子项的笛卡尔积。很显然,通过桥接模式可以避免建立这个“积”数量个的类继承关系。
bridgepattern01

优点

  • 分离抽象和实现,降低系统的耦合度,提升系统的扩展性。
  • 符合开闭原则,即对扩展开放,对修改关闭。
  • 隐藏具体实现细节,使得系统更加安全,更加稳定。
  • 细化控制,桥接模式允许在运行时动态地选择具体实现,提供更大的灵活性和自由度。

缺点

  • 增加系统复杂性,桥接模式需要引入抽象部分和实现部分的抽象类和具体实现类,会增加类的数量,同时需要管理抽象部分和实现部分之间的关联关系。
  • 增加系统的理解与设计难度,增加开发工作量。

适用场景

  • 当需要分离抽象部分和实现部分,降低系统耦合时,可以使用桥接模式。

  • 当希望在抽象部分和实现部分之间建立灵活的组合关系,避免在两个层次之间建立静态继承时。

  • 当一个事物存在两个独立变化的维度,且这两个维度都需要进行扩展,适合使用桥接模式。

  • 对于那些不希望因使用继承或多层次继承导致类数量爆炸增长的系统,桥接模式也尤为适用。

二、模拟支付场景

对于上述的支付场景,无论支付平台以及支付方式如何扩展,我们都可以通过桥接模式来组合系统中的所有支付情景。系统总体结构如下:

bridgepattern-uml

步骤1:模拟支付方式接口PayMode和其两大实现

public interface PayMode {
    void paymode();
}
public class PasswordPay implements PayMode{
    @Override
    public void paymode() {
        System.out.println("--用密码支付");
    }
}
public class FingerPay implements PayMode{
    @Override
    public void paymode() {
        System.out.println("--用指纹支付");
    }
}

步骤2:创建抽象类Pay,和两大支付平台实现类

Tip:这里创建的是抽象类Pay而不是接口,因为需要在类中持有PayMode的引用,这个引用就是所谓的“桥”。还需要注意一点,payMode访问修饰符为protected,方便继承给子类。

public abstract class Pay {
    
    protected PayMode paymode;
    
    public Pay(PayMode paymode) {
        this.paymode = paymode;
    }
    public abstract void pay();
}
public class WechatPay extends Pay{

    public WechatPay(PayMode paymode) {
        super(paymode);
    }

    @Override
    public void pay() {
        System.out.println("微信支付:");
        paymode.paymode();
    }
}
public class AliPay extends Pay{

    public AliPay(PayMode paymode) {
        super(paymode);
    }

    @Override
    public void pay() {
        System.out.println("支付宝支付:");
        paymode.paymode();
    }
}

步骤3:客户端测试

public class Client {
    public static void main(String[] args) {
        Pay wechatPay1=new WechatPay(new PasswordPay());
        Pay wechatPay2=new WechatPay(new FingerPay());
        wechatPay1.pay();
        wechatPay2.pay();

        System.out.println();

        Pay aliPay1=new AliPay(new PasswordPay());
        Pay aliPay2=new AliPay(new FingerPay());
        aliPay1.pay();
        aliPay2.pay();
    }
}

测试结果

image-20230525165942638

三、总结

本文详细讲解了桥接模式的原理和实现,通过模拟经典的支付场景,让你进一步加深对桥接模式的理解。总的来说,桥接模式在将抽象和实现解耦、提高系统的可扩展性和灵活性方面非常有用。然而,桥接模式的引入会增加系统的理解与设计难度,在设计阶段应根据实际需求和系统的复杂度来评估是否使用桥接模式。

希望这篇文章对你的学习有所帮助!如果你觉得这篇文章对你有帮助,请不要吝啬你的赞美和分享。在此感谢你的阅读,我们下次再见!

1711edbd2bd444b1b647e09c2c3aff0d

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

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

相关文章

《C和指针》读书笔记(第八章 数组)

目录 0 内容简介1. 一维数组1.1 数组名1.2 下标引用1.3 指针与下标1.4 指针的效率1.5 数组和指针1.6 作为函数参数的数组名1.7 声明数组参数1.8 初始化1.9 不完整的初始化1.10 自动计算数组长度1.11 字符数组的初始化 2. 多维数组2.1 存储顺序2.2 数组名2.3 下标2.4 指向数组的…

爆火出圈的chatGPT,到底是什么东东?

爆火出圈的chatGPT,到底是什么东东? 前言 2022年 11 月 30 日,OpenAI 实验室创始人兼 CEO Sam Altman 宣布发布聊天机器人模型:ChatGPT。ChatGPT 可以模仿人类的说话风格回答问题。很快,ChatGPT 火爆社交圈&#xff…

Linux音频和视频命令速查表

在Linux系统中,有许多命令可以帮助我们处理音频和视频文件,从基本的播放和转码,到编辑和处理音频、视频流。 本文将提供一个Linux音频和视频命令速查表,帮助您快速查找并了解各种常用的命令及其用法。 音频命令 播放音频文件 a…

堆和堆排序

目录 堆的概念 堆的实现 堆的存储结构 堆的插入操作 堆的删除操作 堆的创建 向上调整建堆和向下调整建堆 堆排序 堆的应用 - topK问题 堆的概念 “堆”是计算机科学中一种数据结构,可以看作是一棵完全二叉树。通常满足堆的性质:父节点的值总是…

【Linux】进程控制 — 进程程序替换 + 实现简易shell

文章目录 📖 前言1. 进程程序替换1.1 程序替换的概念:1.2 为什么要程序替换:1.3 程序替换的原理: 2. 六个exec替换函数2.1 execl函数:2.2 execv函数:2.3 execlp函数:2.4 execvp函数:…

chatgpt赋能python:Python[:2]——简介和应用

Python [:2]——简介和应用 Python [:2]是一种流行的编程语言,其简单易用的语法使其成为许多人的首选编程语言之一。Python [:2]的迅速增长已经超越了其他编程语言,并且它正在成为各行各业中最有前途的编程语言之一。 Python 基础 Python [:2]的语法非…

MSQL系列(三) Mysql实战-索引最左侧匹配原则原理

Mysql实战-索引最左侧匹配原则原理 前面我们讲解了索引的存储结构,我们知道了BTree的索引结构,索引的叶子节点是严格排序的,就像你看到的 底层叶子节点 15->18->20->30->49->50等等 这样做有什么好处呢? 这就引出…

利用qsort排序

一、简单排序10个元素的一维数组 #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include<stdio.h> #include<stdlib.h> void print_arr(int arr[], int sz) {int i 0;for (i 0; i < sz; i){printf("%d ", arr[i]);}printf("…

WMS服务启动

WMS服务启动 1、SystemServer.java#startOtherServices(t)中启动2、WindowManagerService.java#main创建初始化3、简易时序图4、相关线程 1、SystemServer.java#startOtherServices(t)中启动 WMS属于SystemServer启动众多的系统服务中的一个&#xff0c;WindowManagerService中…

社会工程学技术框架解读

社会工程学技术其实就是利用各种心理进行技术上的欺骗。 尽管许多社会工程学大师都是无师自通,依赖自己的天赋悟性、聪明才智和临场应变能力不断演绎着社会工程学艺术,然而,社会工程学仍然具有一些通用的技术流程与共性特征。Social-Engineer 网站创始人克里斯哈德纳吉对其加…

Spring Cloud Alibaba 快速上手搭建公司项目(二)Nacos

Nacos(全称为&#xff1a;阿里巴巴开源项目 - 命名服务 & 配置中心)是阿里巴巴集团开源的一个动态服务发现、配置管理和服务管理平台。它提供了一种简单易用的方式来管理和监控微服务应用程序中的服务实例、配置和元数据。 Nacos是一个高度可扩展的平台&#xff0c;支持多…

chatgpt赋能python:Python中的[::-1]操作:反转列表、元组和字符串

Python中的[::-1]操作&#xff1a;反转列表、元组和字符串 在Python编程中&#xff0c;[::-1]是一个相当常用的操作符&#xff0c;它可以对列表、元组、字符串等序列类型进行反转。本文将详细介绍这个操作符的语法和使用方法&#xff0c;并且为您提供一些在实际应用中的例子。…

css浮动特性

1. 传统网页的三种布局方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

类和对象【3】初始化列表

全文目录 引言初始化列表定义特性 总结 引言 上一篇文章中介绍了构造函数&#xff0c;它可以在实例化一个类对象的时候自动调用&#xff0c;以初始化类对象&#xff1a; 戳我看默认成员函数详解 但是&#xff0c;不难发现&#xff0c;在构造函数体中对成员变量的初始化其实是属…

武汉环保门禁电子台账视频监控系统

武汉环保门禁电子台账视频监控系统&#xff0c;是顺应国家政策需求&#xff0c;基于视频监控、环保门禁系统、物联技术&#xff0c;结合大数据和人工智能等技术手段&#xff0c;对汽车排放单位进行环境管理的一套综合系统。 系统介绍 该系统实现对机动车排放检测的监管&#…

Android 读取本地数据进行本地开发

前言 在日常开发当中&#xff0c;API接口还没有部署&#xff0c;但是UI已经出来了&#xff0c;这时候往往都会使用本地数据进行功能界面的搭建&#xff0c;这样往往能很大程度节约开发时间&#xff0c;工具类拿来直接用&#xff0c;话不多说&#xff0c;开整 一、项目搭建 1…

Web应用技术(第十四周/持续更新)

本次练习基于how2j和课本,初步认识Spring。 以后我每周只写一篇Web的博客&#xff0c;所以的作业内容会在这篇博客中持续更新。。。 一、Spring基础1.Spring概述:2.Sring组成&#xff1a;3.BeanFactory&#xff1a;4.控制反转&#xff1a;5.依赖注入&#xff1a;6.JavaBean与S…

学习Java可以从事什么岗位(合集)

学习Java可以从事什么岗位 学习Java可以从事的岗位 Java可以做网站 Java可以用来编写网站&#xff0c;现在很多大型网站都用Jsp写的&#xff0c;JSP全名Java Server Pages 它是一种动态网页技术&#xff0c;比如我们熟悉的163&#xff0c;一些政府网站都是采用JSP编写的。 所以…

MySQL小练习(使用JDBC操作数据库)

题目&#xff1a; 1.创建一个数据库(学号姓名缩写,如: 2020001zs)在数据库中创建一张表 (五个以上字段) ; 2.使用JDBC(使用PreparedStatement接口) 操作数据库对表中的数据进行增删改查操作 目录 一、数据库 1.创建数据库 2.创建表 3.添加数据 二、JDBC 1.准备环境 2.查询…

TCO-PEG-Thiol,反式环辛烯聚乙二醇巯基,具有末端硫醇基团的双功能TCO PEG衍生物

产品描述&#xff1a; TCO PEG Thiol是具有末端硫醇基团的双功能TCO PEG衍生物。TCO&#xff08;反式环辛烯&#xff09;基团与四嗪基团快速有效地反应&#xff0c;而硫醇&#xff08;巯基&#xff09;可用于与马来酰亚胺反应&#xff0c;与金表面结合并参与许多其他反应。 TC…