11、【桥接模式】让将抽象和实现分离,使得它们可以独立地变化

你好,我是程序员雪球。

今天我们来聊聊 23 种设计模式中,一种常见的结构型模式,桥接模式。聊聊它的设计思想、应用场景,以及如何使用。

 c60ea17d6a8a491db0313f29005986f9.png

 

一、设计思想

 

桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。这种模式涉及到两个独立的类层次结构:抽象类层次结构和实现类层次结构。抽象类层次结构定义了抽象接口和抽象类,而实现类层次结构则提供了具体的实现。

 

在桥接模式中,抽象类层次结构中的抽象类通过引用或组合的方式与实现类层次结构中的实现类进行关联。这种关联允许抽象类在不改变自身的情况下,通过切换不同的实现类来适应不同的需求。这使得抽象类和实现类可以独立地进行扩展和修改,提高了代码的灵活性和可维护性。

 

二、应用场景

 

桥接模式的应用场景包括以下几个方面:

 

1. 平台无关性:当需要创建一个能够在多个平台上运行的软件系统时,可以使用桥接模式将平台相关的实现与平台无关的抽象部分分离。这样,系统可以根据不同的平台选择相应的实现类,从而实现平台无关性。

2. 多态性:桥接模式允许在运行时动态选择不同的实现类,从而实现多态性。这使得系统可以根据不同的需求选择不同的实现方式,提高了代码的灵活性和扩展性。

3. 可扩展性:桥接模式允许在不修改抽象类的情况下添加新的实现类。这使得系统可以轻松地扩展新的功能,而不会影响现有的代码。

4. 可复用性:桥接模式将抽象部分和实现部分分离,使得抽象类可以在不同的系统中复用,而实现类可以根据具体需求进行定制。这提高了代码的可复用性和可维护性。

 

三、如何使用

 

下面是一个使用 Java 实现桥接模式的示例代码:

 

 

public class BridgePatternExample {

    public static void main(String[] args) {

        // 创建抽象类

        AbstractShape abstractShape = new Circle();

        // 创建实现类

        AbstractImplementation abstractImplementation = new RedImplementation();

        // 将抽象类和实现类关联起来

        abstractShape.setImplementation(abstractImplementation);

        // 调用抽象类的方法,实际执行的是实现类的方法

        abstractShape.draw();

    }

}

 

// 抽象类

abstract class AbstractShape {

    protected AbstractImplementation implementation;

 

    public AbstractShape(AbstractImplementation implementation) {

        this.implementation = implementation;

    }

 

    public void setImplementation(AbstractImplementation implementation) {

        this.implementation = implementation;

    }

 

    public abstract void draw();

}

 

// 具体实现类

class Circle extends AbstractShape {

    public Circle(AbstractImplementation implementation) {

        super(implementation);

    }

 

    @Override

    public void draw() {

        System.out.println("Circle: drawing with color " + implementation.getColor());

    }

}

 

// 具体实现类

class RedImplementation extends AbstractImplementation {

    @Override

    public String getColor() {

        return "red";

    }

}

 

// 具体实现类

class BlueImplementation extends AbstractImplementation {

    @Override

    public String getColor() {

        return "blue";

    }

}

 

// 抽象接口

interface AbstractImplementation {

    String getColor();

}

 

 

在这个示例中,我们定义了一个抽象类  AbstractShape ,它有一个抽象方法  draw() 。我们还定义了一个抽象接口  AbstractImplementation ,它有一个抽象方法  getColor() 。具体的实现类  Circle  和  RedImplementation  分别实现了  AbstractShape  和  AbstractImplementation  接口。

 

在  main()  方法中,我们创建了一个  Circle  对象,并将其与  RedImplementation  对象关联起来。然后,我们调用  draw()  方法,实际执行的是  RedImplementation  对象的  getColor()  方法,从而实现了桥接模式的效果。

 

通过桥接模式,我们将抽象部分和实现部分分离,使得它们可以独立地变化。这样,我们可以根据不同的需求选择不同的实现类,而不会影响抽象类的代码。同时,抽象类也可以在不同的系统中复用,提高了代码的可复用性和可维护性。

 

总结:

 

以上已经为你讲解了桥接模式的设计思想、应用场景,以及如何使用,接下来我带你一起总结。

 

一、设计思想

 

将抽象部分与实现部分分离,使它们可以独立地变化。

 

二、应用场景

 

1. 多态性;

2. 可扩展性;

3. 可复用性;

 

三、如何使用

 

在桥接模式中,抽象类层次结构中的抽象类通过引用或组合的方式与实现类层次结构中的实现类进行关联。这种关联允许抽象类在不改变自身的情况下,通过切换不同的实现类来适应不同的需求。

 

讨论环节:

 

为了方便你理解和巩固今天的内容,我给你留下两个讨论题,请在评论区与我一起讨论吧。

 

1. 桥接模式的核心设计思想是什么?

2. 请说说你用过桥接模式的场景?

 

如果觉得有收获,请双击支持,后期我会持续更新更多相关知识。

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

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

相关文章

Python slice切片

1. 切片简介 取一个str、list、tuple的部分元素是非常常见的操作 切片 译自英文单词slice,指的是一部分切片 根据 步长step 从原序列中取出一部分元素组成新序列切片适用于 字符串、列表、元组 2. 切片的格式 字符串[开始索引:结束索引:步长] 包含开始索引, 不包含结束索…

python numpy库简述

# numpy为我们提供了一个特殊的数组对象,我们可以用numpy表示普通的一维数组,二位矩阵,甚至任意维度的数据,并对数组中的数据作高效的运算 # 一般使用numpy处理数据需要将要出库的数据向量化,并行化通常使用二维数组处…

vue+springboot实验个人信息,修改密码,忘记密码功能实现

前端部分 新增Person(个人页面),Password(修改密码页面),还需要对Manager,login页面进行修改 router文件夹下的index.js: import Vue from vue import VueRouter from vue-router i…

视频下载为什么需要大带宽服务器?

视频直播已经成为人们日常生活中的常见形式之一。而在视频直播过程中,为什么需要大带宽呢?本文将深入探讨视频直播中为什么需要大带宽的原因。 视频直播的特点 视频直播是通过互联网进行实时视频传输的方式,与传统的视频点播相比,…

在 vue3 中使用高德地图

前言:定位地图位置所需要的经纬度,可以通过 拾取坐标 获取。 一:快速上手 1. 安装依赖 npm install amap/amap-jsapi-loader # or pnpm add amap/amap-jsapi-loader # or yarn add amap/amap-jsapi-loader 2. 创建组件 src/components/Ma…

飞书小技巧:markdown导出

文章目录 下载Feishu2Md飞书应用配置配置feishu2md工具绑定应用导出markdown 下载Feishu2Md Feishu2Md 飞书应用配置 进入飞书开发者后台 https://open.feishu.cn/app。 点击“创建企业自建应用”,并填写应用名称等信息。而后点击创建。 PS: 此处作者创建应用名…

C++ | Leetcode C++题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution { public:int trap(vector<int>& height) {int n height.size();if (n 0) {return 0;}vector<int> leftMax(n);leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] max(leftMax[i - 1], he…

网络安全之数据库基础篇(基础入门)

目录 一&#xff0c;操作数据库 1&#xff0c;查询所有数据库 2&#xff0c;创建数据库 3&#xff0c;查看数据库是否被创建 4&#xff0c;查看数据库的字符集 5&#xff0c;修改数据库的字符集 6&#xff0c;删除数据库 7&#xff0c;使用数据库 8&#xff0c;查看当前…

【Linux系统编程】

Linux系统编程 一.文件编程1.常用API1.1 打开&#xff1a;open1.2 读写&#xff1a;write/read1.3 光标定位: lseek1.4 创建&#xff1a;creat1.4 关闭&#xff1a;close 2.文件的打开及创建3.文件的写入4.文件的读取5.文件描述符5.代码实现cp指令6.编程实现修改文件配置7.写一…

计算机视觉与深度学习 | 基于特征的图像配准技术(全景图像拼接)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 基于特征的图像配准技术(全景图像拼接) 图像加载特征提取与图像配准初…

学习JavaEE的日子 Day40 反射案例

Day40 1.反射案例 之 万能数组扩容 public class Test01 {public static void main(String[] args) {String[] ss {"小希","小空","小丽","小光","小爱"};String[] newSS MyArrays.copyOf(ss, 8);System.out.println(My…

实现Node.js安装与配置。

一 、Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;用于构建高性能、可扩展的网络应用程序。它发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;允许使用JavaScript进行服务器端编程&#xff0c;使开发者能够在前后端都使用同一种编程…

Unity 新版输入系统(Input System)

前言 官方教程 注意 新的输入系统需要 Unity 2019.4 和 .NET 4 运行时。它不适用于 .NET 3.5 的项目。 教程版本&#xff1a;Unity 2021.3.26 1. 安装 1.1 打开 Package Manager 导航栏 -> Window -> Package Manager 1.2 安装 Input System 选择 Unity Registry 在列…

RabbitMQ, DelayQueue, Redis的介绍以及IDEA的实现

RabbitMQ RabbitMQ是一个开源的消息队列中间件&#xff0c;它实现了高效、可靠的消息传递机制。它支持多种消息传递模式&#xff0c;如发布/订阅、点对点、请求/回应等。RabbitMQ以其可靠性、灵活性和易用性受到广泛的关注和应用。 RabbitMQ基于AMQP&#xff08;Advanced Mess…

字符串刷题(day1)题解

文章目录 字符串刷题一、Erase First or Second Letter二、Swap and Reverse三、Largest Subsequence四、XOR Palindromes五、Strong Password六、Row Major七、Game with Reversing八、Tear It Apart 字符串刷题 vjudge题单 一、Erase First or Second Letter [Erase First…

孙中亮:北斗三十周年,看北斗芯片高质量发展历程和方向

1994年1月10日&#xff0c;北斗一号建设正式启动&#xff0c;党中央决策建设独立自主的北斗卫星导航系统。2020年7月31日&#xff0c;北斗三号全球卫星导航系统正式开通&#xff0c;标志着北斗系统进入全球化发展新阶段。随着2024年的到来&#xff0c;北斗系统建设已走过栉风沐…

汇智知了堂走进宜宾学院,共话国产化信创未来!

在春意盎然的四月&#xff0c;汇智知了堂以其深厚的品牌底蕴和卓越的教育品质&#xff0c;再次展现了其在教育领域的领先地位。4月18日&#xff0c;汇智知了堂走进宜宾学院&#xff0c;为广大学子带来了一场关于国产化信创时代的技术变革与专业学习建议的讲座。 汇智知了堂作…

前端 -- if-else嵌套地狱

要解决 if-else 嵌套地狱问题&#xff0c;可以考虑以下几种方法&#xff1a; 1. 使用早返回&#xff08;Early Return&#xff09;&#xff1a; 尽早返回函数&#xff0c;避免深层嵌套。 将条件判断简化为多个独立的 if 语句&#xff0c;每个 if 语句处理一种情况。 2. 使用…

2024深圳杯(东三省)数学建模挑战赛D题:音板的振动模态分析与参数识别思路代码成品论文分析

​ 更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯&#xff08;东三省&#xff09;数学建模挑战赛2024D题&#xff1a;音板的振动模态分析与…

YoloV9改进策略:注意力改进、Neck层改进_自研全新的Mamba注意力_即插即用,简单易懂_附结构图_检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 基于Mamba的高效注意力代码和结构图 import torch import torch.nn as nn # 导入自定义的Mamba模块 from mamba_ssm import Mamba class Eff…