Java中的桥接模式(Bridge Pattern)

2023-11-02

Java中的桥接模式(Bridge Pattern)

Java中的桥接模式(Bridge Pattern)是一种结构性设计模式,它将抽象部分和实现部分分离,使它们可以独立变化,同时通过桥接对象将它们连接起来。桥接模式通过将继承关系转变为对象组合,以实现抽象和实现的解耦。

在桥接模式中,抽象部分指的是高层的抽象类或接口,定义了抽象方法和对实现部分的引用。实现部分指的是低层的实现类或接口,提供了具体的实现细节。桥接模式通过桥接对象(也称为连接器)将抽象部分和实现部分连接在一起,使它们可以独立地变化。

以下是桥接模式的一些优势:

  1. 解耦抽象与实现:桥接模式通过将抽象部分和实现部分分离,使它们可以独立地变化。这样,抽象部分和实现部分可以在不影响彼此的情况下进行扩展和修改。

  2. 提高可扩展性:由于抽象部分和实现部分是独立变化的,因此可以方便地新增新的抽象部分和实现部分,并通过桥接对象进行组合。这种灵活性和可扩展性使得系统更容易适应变化。

  3. 实现细节对客户端透明:客户端只需要与抽象部分进行交互,对于实现部分的具体细节是透明的。这样可以隐藏实现细节,减少对客户端的暴露,提高系统的安全性和稳定性。

  4. 支持多维度变化:桥接模式允许抽象部分和实现部分独立变化,可以支持多个维度的变化。例如,可以通过扩展抽象部分或实现部分来引入新的功能或变体,而不会影响到其他部分。

桥接模式在以下场景下特别有用:

  1. 当存在多个独立变化的维度时,可以使用桥接模式来避免类爆炸问题。例如,如果有多种形状和多种颜色,通过桥接模式可以避免创建形状和颜色的所有组合类。

  2. 当希望在抽象部分和实现部分之间建立稳定的关系,并且这些部分需要能够独立变化时,可以使用桥接模式。

  3. 当希望在运行时动态地将实现部分指定给抽象部分时,桥接模式提供了灵活性和可配置性。

需要注意的是,桥接模式可能增加了系统的复杂性,因为需要额外的抽象部分和实现部分之间的桥接对象。因此,只有在确实需要分离抽象和实现,并且存在多个独立变化的维度时,才适合使用桥接模式。

总结起来,桥接模式通过将抽象部分和实现部分分离,并通过桥接对象连接它们,实现了抽象和实现的解耦。它提供了灵活性、可扩展性和多维度变化的支持,适用于存在多个独立变化维度的场景。

举例说明

假设我们有两个维度的变化:图形形状(如圆形、矩形)和绘制方式(如画笔、喷漆)。使用桥接模式可以将它们解耦,使它们可以独立变化。

首先,我们定义一个抽象的图形类 Shape,它有一个抽象方法 draw:

public abstract class Shape {
    protected DrawingAPI drawingAPI;
    
    protected Shape(DrawingAPI drawingAPI) {
        this.drawingAPI = drawingAPI;
    }
    
    public abstract void draw();
}

然后,我们定义一个实现了图形类的具体子类 Circle 和 Rectangle,并实现了 draw 方法:

public class Circle extends Shape {
    private double x, y, radius;
    
    public Circle(double x, double y, double radius, DrawingAPI drawingAPI) {
        super(drawingAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }
    
    public void draw() {
        drawingAPI.drawCircle(x, y, radius);
    }
}

public class Rectangle extends Shape {
    private double x, y, width, height;
    
    public Rectangle(double x, double y, double width, double height, DrawingAPI drawingAPI) {
        super(drawingAPI);
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    
    public void draw() {
        drawingAPI.drawRectangle(x, y, width, height);
    }
}

接下来,我们定义一个绘制的接口 DrawingAPI,它有两个抽象方法 drawCircle 和 drawRectangle:

public interface DrawingAPI {
    void drawCircle(double x, double y, double radius);
    void drawRectangle(double x, double y, double width, double height);
}

然后,我们定义两个实现了绘制接口的具体实现类 PenDrawingAPI 和 SprayPaintDrawingAPI:

public class PenDrawingAPI implements DrawingAPI {
    public void drawCircle(double x, double y, double radius) {
        System.out.println("用画笔绘制圆形,中心坐标 (" + x + "," + y + "),半径 " + radius);
    }
    
    public void drawRectangle(double x, double y, double width, double height) {
        System.out.println("用画笔绘制矩形,左上角坐标 (" + x + "," + y + "),宽度 " + width + ",高度 " + height);
    }
}

public class SprayPaintDrawingAPI implements DrawingAPI {
    public void drawCircle(double x, double y, double radius) {
        System.out.println("用喷漆绘制圆形,中心坐标 (" + x + "," + y + "),半径 " + radius);
    }
    
    public void drawRectangle(double x, double y, double width, double height) {
        System.out.println("用喷漆绘制矩形,左上角坐标 (" + x + "," + y + "),宽度 " + width + ",高度 " + height);
    }
}

最后,我们可以在客户端代码中使用桥接模式来创建具体的图形对象并进行绘制:

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle(1, 2, 3, new PenDrawingAPI());
        circle.draw();
        
        Shape rectangle = new Rectangle(4, 5, 6, 7, new SprayPaintDrawingAPI());
        rectangle.draw();
    }
}

运行上述代码,将会得到如下输出:

用画笔绘制圆形,中心坐标 (1,2),半径 3
用喷漆绘制矩形,左上角坐标 (4,5),宽度 6,高度 7

通过桥接模式,我们将图形形状和绘制方式进行了解耦,可以独立地对它们进行扩展和变化。如果要新增一种绘制方式或图形形状,只需创建对应的实现类并传递给抽象的图形类即可,而不需要修改已有的代码。这样可以实现代码的灵活性和可扩展性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的桥接模式(Bridge Pattern) 的相关文章

随机推荐

  • 在 Windows 下关闭135/139/445端口的方法

    一 关闭 135端口 第一步 运行dcomcnfg 打开 组件服务 计算机 在 我的电脑 上右键点击 选 属性 然后点默认属性 把 在此计算机上启用分布式COM E 的勾去掉 接着返回到 默认协议 移除 面向连接的 TCP IP 协议 这操
  • VMware虚拟机实用经验总结大全

    1 VMware虚拟机实用经验之支持的Guest OS VMWare支持如下Guest OS MS DOS Win3 1 Win9x Me WinNT Win2000 WinXP Win Net Linux FreeBSD NetWare6
  • Vue学习之起步——浅谈文件系统

    学习前谈 大家都知道 Vue是一个比较火的前端框架 作为一个开发者 我们虽然没必要深究其底层原理 但是 它的 文件系统 执行脉络我们还是得梳理清楚的 首先 Vue启动时会进入 main js 即 main js 是入口文件 import V
  • c语言if语句习题,C语言练习

    C语言练习 D 算法只能被有限的用户使用 18 有如下嵌套的if语句 以下选项中与上述if语句等价的语句是 A k aB B b gt C b C B k aD k a 19 有以下程序 程序运行后的输出结果是 A 0 B 1 C 2 D
  • (一)K8S集群部署——master节点部署

    1 集群配置 本次部署使用三台服务器 master 192 168 0 2 node1 192 168 0 4 node2 192 168 0 14 服务器配置均为 CentOS 7 6 64位 8核 16G 100G 2 master部署
  • Unity 3D 读入本地 xml 文件

    Load and Display XML Data in Unity 3D 如果你能翻墙从 youtube 上就可以看到怎么用 using UnityEngine using System Collections
  • IDM怎么设置下载会更快

    虽然IDM的下载速度已经足够彪悍 其优秀的智能动态文件分段功能和安全的分段下载技术 让大多数下载器都望尘莫及 但贪心的我们总是希望下载速度能更快 实际上 IDM也隐藏了部分功力 并可通过配置设置将隐藏的 功力 发挥出来 一般来说 Inter
  • 基于MFC对话框的Windows服务程序

    最近需求要写个服务程序 部分功能用MFC类库实现将非常方便 因此就没打算使用win32的服务程序 虽然那样对于服务很简单 首先写好mfc的对话框程序 调试什么的 功能也都完成好 这一部分和平常的mfc对话框程序没有差别 之后的服务启动后打开
  • Elasticsearch--索引备份与迁移

    Elasticsearch集群备份 以及在不同集群之间迁移数据 类似mongodb的mongodump功能 Elasticsearch也提供了备份集群中索引数据的策略 snapshot API 它会备份整个集群的当前状态和数据 并保存到集群
  • java操作rabbitmq

    JMS JMS是JavaEE规范中的一种 类比JDBC JMS即Java消息服务 JavaMessage Service 应用程序接口 是一个Java平台中关于面向消息中间件的API很多MQ产 品都实现了JMS规范 但RabbitMQ官方并
  • Rsync的配置与使用

    一 介绍 不想看直接可以跳过 Rsync 是一个远程数据同步工具 可通过 LAN WAN 快速同步多台主机间的文件 Rsync 本来是用以取代rcp 的一个工具 它当前由 rsync samba org 维护 Rsync 使用所谓的 Rsy
  • [Transformer]CSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped Windows

    CSWin Transformer 基于交叉十字形窗口的视觉Transformer框架 Abstract Section I Introduction Section II Related Work Section III Method P
  • 使用数字滤波器处理音频噪声(附Matlab程序)

    本篇文章主要介绍使用窗函数法构造FIR数字滤波器 并且滤除音频文件的噪声 以下为完整的程序 修改一下文件的位置 直接复制应该就可以 1 音频文件的采集与分析 Matlab输入的音频文件需要 wav 文件 可以使用一些软件转换格式 例如酷狗音
  • C#音频采集 (笔记)

    using System using System Collections Generic using System Text using System IO using System Threading using Microsoft D
  • Effective C++第七章-模板和泛型编程之模板特化和代码膨胀

    模板特化 class A public void func1 void func2 class B public void func1 void func2 template
  • 用JS的canvas实现数字签名

    用JS的canvas实现数字签名 思路 先创建画布 鼠标按下 同时随着鼠标的移动来绘制签名 最后鼠标松开绘制结束 直接上代码啦
  • electron 1. hello world

    cnpm init y cnpm i electron D 安装electron package json name news windows version 1 0 0 description main main js scripts t
  • 爬取电影天堂

    电影天堂爬虫之网页分析 from lxml import etree import requests BASE DOMAIN http www ygdy8 net url http www ygdy8 net html gndy dyzz
  • java中的sleep()和wait()的区别

    对于sleep 方法 我们首先要知道该方法是属于Thread类中的 而wait 方法 则是属于Object类中的 sleep 方法导致了程序暂停执行指定的时间 让出cpu该其他线程 但是他的监控状态依然保持者 当指定的时间到了又会自动恢复运
  • Java中的桥接模式(Bridge Pattern)

    Java中的桥接模式 Bridge Pattern Java中的桥接模式 Bridge Pattern 是一种结构性设计模式 它将抽象部分和实现部分分离 使它们可以独立变化 同时通过桥接对象将它们连接起来 桥接模式通过将继承关系转变为对象组