设计模式之桥接模式

news2024/11/16 13:50:12

bridge design pattern

桥接模式的概念、桥接模式的结构、桥接模式的优缺点、桥接模式的使用场景、桥接模式的实现示例、桥接模式的源码分析


1、桥接模式的概念

  桥接模式,即将抽象和实现分离,使他们可以独立变化。它是用组合关系来代替继承关系实现的,从而降低了抽象和实现这两个可变维度的耦合度。桥接模式基于类的最小设计原则,通过使用封装、聚合、继承等关系让不同的类承担不同的职责。

2、桥接模式的结构

  • 实现化接口:定义实现化角色行为,供抽象话角色内聚时使用。
  • 具体实现化角色:实现实现化接口,实现具体实现化角色行为。
  • 抽象化角色:定义抽象化角色行为,聚合实现化接口。
  • 扩展抽象化角色:继承抽象化角色,实现抽象化角色定义的抽象化角色行为。并通过组合关系调用实现化接口方法。

bridge-class

3、桥接模式的优缺点

  • 优点:
    • 实现了抽象和实现的分离。
    • 优秀的扩展能力。
    • 实现细节对用户透明。
  • 缺点:
    • 桥接模式的引入会增加系统的理解难度和设计难度,由于聚合关系建立在抽象层,要求开发者针对抽象进行设计和编程。
    • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其适用范围有一定局限性。

4、桥接模式的使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要扩展时。
  • 当一个系统不希望使用继承或因为多层继承导致系统类爆炸时。
  • 当一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。

5、桥接模式的实现示例

实现化接口:

public interface Equipment {

    /**
     * 定义实现化行为
     */
    void behavior();
}

具体实现化角色一:

public class MuRenEquipment implements Equipment {

    @Override
    public void behavior() {
        System.out.println("我是德拉克撒的慕刃");
    }
}

具体实现化角色二:

public class YouMengEquipment implements Equipment {

    @Override
    public void behavior() {
        System.out.println("我是幽梦之灵");
    }
}

抽象化角色:

public abstract class Hero {

    protected Equipment equipment;

    public Hero(Equipment equipment) {
        this.equipment = equipment;
    }

    public abstract void behavior();
}

扩展抽象化角色一:

public class ZedHero extends Hero {

    public ZedHero(Equipment equipment) {
        super(equipment);
    }

    @Override
    public void behavior() {
        System.out.println("我是影流之主");
        this.equipment.behavior();
    }
}

扩展抽象化角色二:

public class FizzHero extends Hero {

    public FizzHero(Equipment equipment) {
        super(equipment);
    }

    @Override
    public void behavior() {
        System.out.println("我是潮汐海灵");
        this.equipment.behavior();
    }
}

测试:

public class BridgeTest {

    public static void main(String[] args) {
        Hero zed = new ZedHero(new MuRenEquipment());
        zed.behavior();
    }
}

测试结果:

我是影流之主
我是德拉克撒的慕刃

6、桥接模式的源码分析

  jdk 的 java.sql 包中的 DriverManager 的设计即用到了桥接模式。客户端通过 Class.forName(“”) 将数据库驱动加载注册到 DriverManager 中,DriverManager 是个 Driver 容器,管理不同的 Driver,即 DriverManager 聚合了 Driver。

public class DriverManager {
  ...
  public static void registerDriver(java.sql.Driver driver,
            DriverAction da)
        throws SQLException {

        /* Register the driver if it has not already been added to our list */
        if (driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }

        println("registerDriver: " + driver);

    }
  
  class DriverInfo {

    final Driver driver;
    DriverAction da;
    DriverInfo(Driver driver, DriverAction action) {
        this.driver = driver;
        da = action;
    }
  }
}

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

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

相关文章

赫夫曼树 | 实战演练

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

关于动漫的HTML网页设计:期末前端web大作业——海贼王基地(6个页面)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

QT—5种标准对话框使用详解

对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。所谓标准对话框,是 Qt 内置的一系列对话框&#xff…

kafka问题总结

kafka问题总结【1】Kafka 都有哪些特点?【2】为什么要使用 kafka,为什么要使用消息队列?【2】kafka的使用场景【3】Kafka 的设计架构【4】kafka分区的目的【5】Kafka 是如何做到消息的有序性?【6】Kafka 的高可靠性是怎么实现的&a…

【操作系统-总论】发展历程、体系结构、虚拟机

文章目录1 操作系统的发展历程1.1 手工操作阶段1.2 批处理阶段1.2.1 单道批处理系统(单道程序系统)1.2.2 多道批处理系统(多道程序系统)1.3 分时操作系统1.4 实时操作系统2 操作系统的体系结构3 虚拟机1 操作系统的发展历程 1.1 …

Nginx教程(3)—负载均衡

文章目录3.1 负载均衡-轮询3.2 负载均衡-加权轮询3.3 upstream指令参数3.4 使用JMeter测试集群3.5 负载均衡之IP_hash3.6 一致性hash算法3.7 Nginx控制浏览器缓存3.8 Nginx反向代理缓存Nginx教程一 Nginx教程二 3.1 负载均衡-轮询 轮询是Nginx默认使用的策略,轮询算…

jmeter做压测性能调优:SSL上下文切换导致SSL频繁握手【杭州多测师_王sir】【杭州多测师】...

一、问题背景在使用 JMeter 压测时,发现同一后端服务,在单机 500 并发下,HTTP 和 HTTPS 协议压测 RT 差距非常大。同时观测后端服务各监控指标水位都很低,因此怀疑性能瓶颈在 JMeter 施压客户端。二、问题分析切入点:垃…

【无标题】大模型时代,视觉推理任务竟然只用语言数据也能学习

原文链接:https://www.techbeat.net/article-info?id4394 作者:seven_ 要让AI模型真正具备智能感知和认知的功能,我们就不得不把视觉分析和自然语言理解二者结合起来进行研究。AI大模型社区的成长为我们带来了很多极具想象力和创造力的新应用…

基于FPGA通过1Gb以太网低延迟传输专业级4K AV信号解决方案

ME10 SoC是全栈AV Over IP片上IP系统(SoC),通过1Gb网络传输HDMI2.0 4K 4:4:4 的视频、音频和控制数据,ME10 SoC采用一个小的23 x 23毫米BGA封装。ME10主要特色为互通性和优越性能。 IPMX是AV的开放标准和规范的集合,专为专业AV市场开发的IP。…

【并发编程七】C++进程通信——套接字(socket)_80行代码实现一个聊天软件

【并发编程七】进程通信——套接字(socket)_80行代码实现一个聊天软件一、简介二、相关知识介绍1、winsock1.h、winsock2.h2、如何使用ws2_32.dll3、WSAStartup() 函数4、socket5、bind5、listen6、accept7、connect三、聊天软件的代码如下1、服务端2、客…

QT系列第5节 QT中常用输入控件

QT中经常利用控件来获取用户输入数据,本篇将介绍常用的用户输入控件 目录 (1) QSpinBox (2) QDoubleSpinBox (3)QSlider (4) QScrollBar (5)QProgressBar (6)QDia…

@MapperScan原理探究

1. 前言 MyBatis在整合Spring的时候,只需要加如下注解,就可以将Mapper实例注册到IOC容器交给Spring管理,它是怎么做到的呢??? MapperScan("com.xxx.mapper")提出几个问题: Mapper接…

Snipaste的使用

Snipaste截屏软件的使用: 1、开始截屏 第一种方式:快捷键 (默认是F1)也就是说按一下F1键就会进入截屏状态。 第二种方式:点击软件在任务栏上的图标。 2、选定截屏区域: 进入截屏状态后移动鼠标&#x…

绩效考核管理方案

第一部分 总 则 第一条:目的 1、通过绩效考核,传递组织目标和压力,促使员工提高工作绩效,达到“培养员工、提高员工的工作能力、纠正员工偏差、使之更好地为公司服务,达到公司与个人之间的双赢”的目的。 2、加强公司的…

四、fs文件系统模块

fs模块是Node.js官方提供用来操作文件的模块,属于核心模块,提供了一些列的方法和属性,用来满足用户的操作需求; 引入fs模块 const fs require(fs); fs.readFile() 读取 读取指定的内容,fs.readFile(path[&#xff…

图文排版 之 line-height

图文排版 之 line-height 设置行盒子的高度. line-height 经常被用来设置多行文本的行间距. 对于块级元素, line-height 制定了行盒子的最小高度. 对于非替换的内联元素, line-height 的值用来计算行盒子的高度. 一般来说, 大家都知道一个 div 的高度默认是由其子元素撑起的, …

史上最全 Java 高频面试合集,命中率高达 95%

进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全,其中概括的知识点有:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、 Redis、MySQL、Spring、S…

现代控制理论

系统的状态空间表达式的建立 建立系统状态空间表达式的三种方法 (1)根据系统的方框图列写 (2)从系统的基本原理推导 (3)根据传递函数或者高阶微分方程实现 方框图法 有些系统的系统机理还没搞清楚可以使…

nodejs+vue高校教室管理系统

摘 要 1 1 系统概述 4 1.1研究背景 4 1.2研究现状 4 1.3主要内容 5 2 系统开发环境 6 2.3 MySql数据库 6 2.4 B/S结构 7 3 需求分析 8 3.1技术可行性:技术背景 8 3.2经济可行性 8 3.3操作可行性 8 3.4系统设计规则 9 3.5系统流程和逻辑 9 4系统概要设计 13 4.1 概…

Delaunay三角网之分治算法

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Delaunay三角网现有的构网算法有很多种,有学者曾对其中一些算法进行了调查和评估(如下图所示)。结果表明,在少量点时,Lawson的增量插入算法、Lee和Schachter的分治算法以及Fortune的平面扫描算法在速度上大致相…