桥接模式:解耦抽象与实现

news2024/11/24 19:57:38

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。本文将深入探讨桥接模式的原理、结构和使用方法,并通过详细的 Java 示例代码来说明。

1. 桥接模式的定义

桥接模式是一种将抽象部分与实现部分分离的设计模式。它通过将抽象部分和实现部分分别定义为独立的接口,并使用组合关系将它们连接起来,从而使它们可以独立地变化。桥接模式的目的是将抽象和实现解耦,使它们可以独立地扩展。

2. 桥接模式的结构

桥接模式包含以下几个核心角色:

  • 抽象部分(Abstraction):定义了抽象部分的接口,通常包含一个对实现部分的引用。
  • 扩展抽象部分(RefinedAbstraction):对抽象部分进行扩展,实现更多功能。
  • 实现部分(Implementor):定义了实现部分的接口,通常包含具体实现的方法。
  • 具体实现部分(ConcreteImplementor):实现了实现部分的接口,提供具体的实现。

下图展示了桥接模式的结构:

 

3. 桥接模式的工作原理

桥接模式的工作原理可以简述如下:

  1. 定义抽象部分的接口,并包含一个对实现部分的引用。
  2. 定义实现部分的接口,并提供具体的实现。
  3. 在抽象部分中,使用组合关系将抽象部分和实现部分连接起来。
  4. 创建具体的抽象部分和具体的实现部分,并实现它们的方法。
  5. 在客户端中,通过抽象部分的接口调用方法。

4. Java 示例代码

下面通过一个简单的 Java 示例代码来演示桥接模式的使用。

首先,我们定义抽象部分的接口 Shape,其中包含一个对实现部分的引用,并定义了绘制图形的方法:

public abstract class Shape {
    protected DrawingAPI drawingAPI;

    protected Shape(DrawingAPI drawingAPI) {
        this.drawingAPI = drawingAPI;
    }

    public abstract void draw();
}

然后,我们定义实现部分的接口 DrawingAPI,其中包含了绘制不同类型图形的方法:

public interface DrawingAPI {
    void drawCircle(double x, double y, double radius);
    void drawRectangle(double x1, double y1, double x2, double y2);
}

接下来,我们创建具体的抽象部分 Circle 和 Rectangle,并实现它们的方法:

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;
    }

    @Override
    public void draw() {
        drawingAPI.drawCircle(x, y, radius);
    }
}

public class Rectangle extends Shape {
    private double x1, y1, x2, y2;

    public Rectangle(double x1, double y1, double x2, double y2, DrawingAPI drawingAPI) {
        super(drawingAPI);
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }

    @Override
    public void draw() {
        drawingAPI.drawRectangle(x1, y1, x2, y2);
    }
}

最后,我们创建具体的实现部分 DrawingAPI1 和 DrawingAPI2,并提供具体的实现:

public class DrawingAPI1 implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.println("Drawing circle with API1. Center: (" + x + ", " + y + "), Radius: " + radius);
    }

    @Override
    public void drawRectangle(double x1, double y1, double x2, double y2) {
        System.out.println("Drawing rectangle with API1. Corner 1: (" + x1 + ", " + y1 + "), Corner 2: (" + x2 + ", " + y2 + ")");
    }
}

public class DrawingAPI2 implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.println("Drawing circle with API2. Center: (" + x + ", " + y + "), Radius: " + radius);
    }

    @Override
    public void drawRectangle(double x1, double y1, double x2, double y2) {
        System.out.println("Drawing rectangle with API2. Corner 1: (" + x1 + ", " + y1 + "), Corner 2: (" + x2 + ", " + y2 + ")");
    }
}

最后,我们在客户端中创建具体的抽象部分和具体的实现部分,并通过抽象部分的接口调用方法:

public class Client {
    public static void main(String[] args) {
        Shape circle = new Circle(1, 2, 3, new DrawingAPI1());
        Shape rectangle = new Rectangle(1, 2, 3, 4, new DrawingAPI2());

        circle.draw();
        rectangle.draw();
    }
}

输出结果为:

Drawing circle with API1. Center: (1.0, 2.0), Radius: 3.0
Drawing rectangle with API2. Corner 1: (1.0, 2.0), Corner 2: (3.0, 4.0)

从输出结果可以看出,通过桥接模式,我们成功地将抽象部分和实现部分解耦,并实现了抽象和实现的独立变化。

5. 桥接模式的优点和适用场景

桥接模式具有以下优点:

  • 解耦性:桥接模式将抽象部分和实现部分分离,使它们可以独立地变化,从而实现解耦。
  • 扩展性:桥接模式可以在运行时动态地选择和切换抽象部分和实现部分,从而实现灵活的扩展。
  • 可维护性:桥接模式使抽象部分和实现部分分离,使系统更易于理解、维护和扩展。

桥接模式适用于以下场景:

  • 需要将抽象部分和实现部分分离,使它们可以独立地变化。
  • 需要在运行时动态地选择和切换抽象部分和实现部分。
  • 需要提供多个维度的扩展。

6. 总结

桥接模式是一种将抽象部分和实现部分分离的设计模式。通过桥接模式,我们可以解耦抽象和实现,使它们可以独立地变化,并实现灵活的扩展。桥接模式具有解耦性、扩展性和可维护性的优点,适用于需要将抽象和实现分离的场景。

公众号请关注"果酱桑", 一起学习,一起进步!

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

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

相关文章

数字信号处理复习知识点

目录 第一章:时域离散系统 1.什么是因果性和稳定性 2.模拟频率,模拟角频率, 数字频率之间的关系 3.什么是频谱混叠? 第二章:时域离散信号和系统的频域分析 1.时域离散信号傅立叶变换的定义 2.如何用模拟信号的傅立…

电信青年员工踏上三千里数字化追梦之旅,数字员工为电信高质量发展注智赋能

导语: 近年来,广西电信紧紧围绕集团战略,聚焦产业数字化发展机遇,加强前瞻性技术研究和人工智能产业应用研究,为夯实高质量发展增添科技动力。 在数字中国建设的大背景下,广西电信全资子公司广西壮族自治区…

推荐一款适合前端宝宝体质的数据库文档工具

先看效果 首页 安心食用 npx dbshowlatest按照提示输入相关信息 Welcome to the DB Show! v0.0.7? Use config from local? no ? Select a database type MySQL ? Enter the host name localhost ? Enter the port number 3306 ? Enter the user name root ? Ente…

Linux slab 分配器源码解析

文章目录 前言一、slab分配器1.1 简介1.2 高速缓存描述符1.3 架构图 二、相关结构体2.1 struct array_cache2.2 struct kmem_list32.3 struct slab2.3.1 简介2.3.2 OFF_SLAB 三、创建和释放slab3.1 创建slab3.1.1 kmem_getpages3.1.2 alloc_slabmgmt3.1.3 slab_map_pages 3.2 释…

常用数据分类算法原理介绍、优缺点分析与代码实现[LR/RF/DT/SVM/NavieBayes/GBDT/XGBoost/DNN/LightGBM等]

本文的主要目的是总结记录日常学习工作中常用到的一些数据分类算法,对其原理简单总结记录,同时分析对应的优缺点,以后需要的时候可以直接翻看,避免每次都要查询浪费时间,欢迎补充。 机器学习领域中常用的分类模型包括以…

分布式事物【Seata实现、下载启动Seata服务、搭建聚合父工程构建】(四)-全面详解(学习总结---从入门到深化)

目录 分布式事物解决方案_XA方案 分布式事物解决方案_Seata实现 Seata提供XA模式实现分布式事务_业务说明 Seata提供XA模式实现分布式事务_下载启动Seata服务 Seata提供XA模式实现分布式事务_搭建聚合父工程构建 创建工程distribute-transaction 字符编码 注解生效激活 Jav…

three js模型旋转

如何让立方体模型旋转到指定的面 父页面 <b-modal ref"modal_mini" size"lg" centered static :hide-footer"true":dialog-class"[modal_mini]":content-class"position-static":body-class"p-0":header-class…

上海亚商投顾:沪指放量调整 两市超4000只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日震荡调整&#xff0c;深成指、创业板指午后跌超1%。AI概念股集体下挫&#xff0c;CPO、算力等方向领跌&am…

感知网络安全态势是什么?感知网络安全态势如何实施

网络安全是当今社会中一个非常重要的话题。随着互联网的普及和信息技术的发展&#xff0c;网络安全问题日益突出。为了有效应对各种网络威胁和攻击&#xff0c;网络安全态势感知成为了一种关键的技术手段。 网络安全态势感知的定义 网络安全态势感知是指通过对网络环境中的各种…

2023-07-11力扣每日一题

链接&#xff1a; https://leetcode.cn/problems/maximum-alternating-subsequence-sum/ 题意&#xff1a; 给定一个数组&#xff0c;求一个子序列&#xff0c;使这个子序列的奇数位和-偶数位和最大&#xff08;下标从1开始的话|反正第一个数是&#xff09; 解&#xff1a;…

基于linux下的高并发服务器开发(第一章)-Linux环境开发搭建1.1

1、安装虚拟机 2、在虚拟机中安装Linux系统 &#xff08;1&#xff09;新建虚拟机向导 点击虚拟机设置&#xff0c;使用ISO映像文件(M) &#xff08;2&#xff09;Ubuntu18安装 点击现在安装 点击继续 静静地接下来的安装即可 安装好后&#xff0c;安装VMware Tools 将压缩…

设计原则及设计模式基础

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结&#xff0c;使用设计模式是为了可以重用代码&#xff0c;让代码更容易被他人理解并且提高代码的可靠性。 1 设计模式概述 GoF(Gang Of Four 四人组&#xff0c;指4位著名软件工程学者)&#xff…

ubuntu安装单个redis服务

1.apt-get install redis-server 使用lighthouse用户这样操作会报与权限有关的错误&#xff0c; 改成使用root账号操作 2.安装完成后&#xff0c;Redis服务器会自动启动&#xff0c;查看进程是否正常启动 ps -axu|grep redis redis 18689 0.1 0.4 40136 6860 ? …

第3讲 Camera Sensor 数据流

Camera Sensor Block Camera Sensor Output Format raw8 一个像素点用8bit来表示&#xff0c;范围0&#xff5e;256 raw10 一个像素点用10bit来表示&#xff0c;范围0&#xff5e;1024 raw12 一个像素点用12bit来表示&#xff0c;范围0&#xff5e;4096 Camera Sensor Fr…

智慧园区:如何利用AI识别与视频技术实现工业园区监管模式的升级?

一、背景分析 智慧园区建设的目标是通过运用现代信息技术&#xff0c;通过智能化管理&#xff0c;解决园区管理中存在的许多难题&#xff0c;例如信息不对称、资源浪费等问题&#xff0c;将园区内的设施、设备和系统进行连接和互通&#xff0c;园区可以实现各种资源的高效利用…

这一次,Python 真的有望告别 GIL 锁了?

Python 中有一把著名的锁——全局解释器锁&#xff08;Global Interpreter Lock&#xff0c;简写 GIL&#xff09;&#xff0c;它的作用是防止多个本地线程同时执行 Python 字节码&#xff0c;这会导致 Python 无法实现真正的多线程执行。&#xff08;注&#xff1a;本文中 Pyt…

TexSpire-比markdown更为简洁的文本标记语言,用文字即可生成演示效果

文章目录 一、前言二、语言特点三、举例1、文本框2、表格3、折线图4、思维导图 四、相关资料 一、前言 老实说&#xff0c;本人对于ppt的花里胡哨深恶痛绝&#xff0c;特别是每一次汇报&#xff0c;都需要花费我很多时间去找模板&#xff0c;去设计&#xff0c;去美化内容时&a…

【源码分析系列】number-precision和bignumber.js

01_JS精度 好久前在公司分享的文章&#xff0c;现在才发…本文阐述了为什么0.1 0.2 ! 0.3&#xff0c;并分析了number-precision和bignumber.js的解决原理 被JS精度问题小坑了一把&#xff0c;所以系统来 复习 学习一波~ 背景 在实际业务开发中&#xff0c;可能会遇到一下问题…

Redis_简介(1)

目录 Redis简介 Redis特性 Redis 优势 Redis应用场景 源码等资料获取方法 Redis简介 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。从2010年3月15日起&#xff0c;Redis的开发工作由…

Git命令-状态与版本查看

Git是一个强大的分布式管理系统,版本控制主要在本地端完成,在团队合作和协助开发中,都在广泛使用Git工具,因为他免费哈哈哈 目录 git status git reflog git reset --hard 版本号 git status 可以查看当前git状态 On branch master 是你当前的分支状态,当前我是在master主…