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

ops/2024/10/18 14:16:13/

你好,我是程序员雪球。

今天我们来聊聊 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.ppmy.cn/ops/6440.html

相关文章

pycharm集成通义灵码

在pycharm中安装通义灵码 1、打开files-settings 2、选中plugins-搜索”TONGYI Lingma“,点击安装 3.安装完成后在pycharm的右侧就有通义灵码的标签 4.点击立即登录,在打开的web页面完成登录操作 5.页面登录成功后回到pycharm查看登录状态显示已经登录成…

第60天:服务攻防-中间件安全CVE复现WeblogicJenkinsGlassFish

目录 思维导图 案例一:中间件-Weblogic-工具探测 案例二: 中间件-JBoos-工具脚本直接利用 弱口令 反序列化命令执行漏洞 CVE-2017-12149 CVE-2017-7504 案例三:中间件-Jenkins-工具脚本利用 远程代码执行漏洞 远程命令执行漏洞 案例四&#xf…

打造一套属于自己的php开发框架(一)封装Db类

一直使用thinkphp或者laravel框架,越到后面越发现,这些框架占用太大了,最主要的是很多东西完全用不到,我就想为啥不能自己封装一个?想到就搞,这个是一个Db类,主要封装了MySQL的增删改查方法&…

uniapp h5项目上传图片到oss(纯前端)

需求:后端给前端一个oss上传地址,前端需要根据getCkOSSToken获取stsToken,使用client.put方法将图片上传成功,并且使用canvas压缩图片 效果图 废话不多说,直接上代码,代码可直接复制,运行 准备工作 cnpm…

107页 | 企业数字化转型规划设计(免费下载)

【1】关注本公众号,转发当前文章到微信朋友圈 【2】私信发送 【企业数字化转型规划设计】 【3】获取本方案PDF下载链接,直接下载即可。 如需下载本方案PPT原格式,请加入微信扫描以下方案驿站知识星球,获取上万份PPT解决方案&…

HarmonyOS NEXT 网格元素交换案例

网格元素交换案例 介绍 直接进行交换和删除元素会给用户带来不好的体验效果,因此需要在此过程中注入一些特色的动画来提升体验效果,本案例通过Grid组件、attributeModifier、以 及animateTo函数实现了拖拽动画和删除动画。 效果图预览 使用说明&#…

vue 的报告页面,生成pdf,使用html2canvas , 下载pdf格式文件。多页分页下载

1. 新建一个js 文件 &#xff0c; 命名 为 html2canvas.js ,html2canvas 文件和jspdf.min.js 放同一目录下。下载文件已上传啦 2. 在vue 文件中引入html2canvas.js 文件 <script>import * as html2Canvas from ./html2canvas.js </script> 3 点击下载&#xff…

Spark面试整理-Spark集成Kafka

Apache Spark和Apache Kafka的集成使得实时数据流处理成为可能。Kafka是一个分布式流处理平台,主要用于构建实时数据管道和流应用。而Spark是一个大规模数据处理工具,可以对大量数据进行批处理和实时处理。 Spark集成Kafka主要通过Spark Streaming或者Structured Streaming实…