初识设计模式-桥接模式

桥接设计模式(Bridge Design Pattern)也叫作桥梁模式,其描述是将实现和抽象放在两个不同的类层次中,使两个层次可以独立地变化。

桥接模式采用抽象关联取代了传统的多层继承,将类之间的静态继承关系转化为动态的对象组合关系,使系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。

在桥接模式中,有以下概念需要理解:

  • 抽象化:将对象共同的性质抽取出去而形成类的过程
  • 实现化:和抽象化是一个互逆的过程,实现化是对抽象化事物的进一步具体化
  • 脱耦:将抽象化和实现化之间强关联改换成弱关联,将两个角色之间的继承关系改为关联关系

桥接模式主要解决的是多维度的指数级变化。

具体实现

以手机为例,手机既可以按照品牌分类,也可以按照手机软件来分类,两种维度交叉的变化远必一种维度多得多。

手机软件代码示例如下:

// 抽象类
public abstract class HandsetSoft {
    public abstract void run();
}

// 实现类
public class HandsetGame extends HandsetSoft {
    @Override
    public void run() {
        System.out.println("运行手机游戏");
    }
}

public class HandsetAddressList extends HandsetSoft {
    @Override
    public void run() {
        System.out.println("运行手机通讯录");
    }
}

手机品牌代码示例如下:

// 抽象类
public abstract class HandsetBrand {
    protected HandsetSoft soft;

    // 设置手机软件
    public void setHandsetSoft(HandsetSoft soft) {
        this.soft = soft;
    }
    // 运行
    public abstract void run();
}

// 实现类
public class HandsetBrandA extends HandsetBrand {
    @Override
    public void run() {
        soft.run();
    }
}

public class HandsetBrandB extends HandsetBrand {
    @Override
    public void run() {
        soft.run();
    }
}

客户端代码示例如下:

public class Client {
    public static void main(String[] args) {
        HandsetBrand ab;

        // A 品牌
        ab = new HandsetBrandA();
        ab.setHandsetSoft(new HandsetGame());
        ab.run();
        ab.setHandsetSoft(new HandsetAddressList());
        ab.run();

        // B 品牌
        ab = new HandsetBrandB();
        ab.setHandsetSoft(new HandsetGame());
        ab.run();
        ab.setHandsetSoft(new HandsetAddressList());
        ab.run();
    }
}

桥接模式的主要优点如下:

  • 实现了抽象和实现部分的分离,从而极大地提高了系统的灵活性
  • 使用桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本
  • 桥接模式提高了系统的可扩展性,在两个维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则

桥接模式的主要缺点如下:

  • 增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性

桥接模式的适用场景如下:

  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
  • 一个类存在两个或多个独立变化的维度,且这两个或多个维度都需要独立进行扩展

桥接模式是设计 Java 虚拟机和实现 JDBC 等驱动程序的核心模式之一,应用较为广泛。

Original: https://www.cnblogs.com/fatedeity/p/16733291.html
Author: 程序员翔仔
Title: 初识设计模式-桥接模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587397/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据结构学习——树的遍历

    树的遍历 前言 在一个平常的星期二下午,一节数据结构课中,想着做点什么的我,打开了力扣。正好老师在讲树,我也从二叉树最基础的遍历开始刷题,没想到打开了新世界的大门······ 前提…

    数据结构和算法 2023年6月12日
    065
  • 树-堆排序

    堆排序 堆排序基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。 堆是具有以下…

    数据结构和算法 2023年6月12日
    083
  • 线段树的可持久化

    可持久化 能够保留每一个历史版本的数据结构。 那么可持久化线段树就是能保留历史版本的线段树。 原谅我之前一直叫它可持续化线段树 。 一般来说,可持久化线段树本质其实是可持久化数组,…

    数据结构和算法 2023年6月12日
    0110
  • C++ sort() 用法介绍

    std:: sort() 所属头文件 介绍 可以对某个范围进行排序 不保证等效元素保持其原始相对顺序 参数 first, last 代表需要排序内容的开始位置和结尾,范围是 [fi…

    数据结构和算法 2023年6月8日
    066
  • 题解P4474 王者之剑

    双倍经验 简要题意 给你一个 (n\times m) 的网格,数字在格子里,你需要取出一些格子,使得任意两个格子之间没有公共边,输出格子中的数字和的最大值。 (1 \le n,m …

    数据结构和算法 2023年6月12日
    082
  • HTTP报文结构

    HTTP报文结构 HTTP报文头 HTTP相应报文 请求方法 状态码 posted @2022-06-14 23:31 放飞梦想C 阅读(21 ) 评论() 编辑 Original…

    数据结构和算法 2023年6月8日
    094
  • Timer和ScheduledThreadPoolExecutor的区别及源码分析

    Timer 基于单线程、系统时间实现的延时、定期任务执行类。具体可以看下面红色标注的代码。 Timer延时、定时任务的实现采用单线程,在主循环(mainLoop)中循环遍历任务队列…

    数据结构和算法 2023年6月8日
    081
  • 0018:线段树详解-uf0_金币灰黄

    先来看一道模板题: https://www.luogu.com.cn/problem/P3372 题目描述: 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上 k。…

    数据结构和算法 2023年6月12日
    083
  • 友情链接

    posted @2022-02-12 22:04 cjwen6 阅读(13 ) 评论() 编辑 Original: https://www.cnblogs.com/cjwen6/p…

    数据结构和算法 2023年6月12日
    094
  • 最小化一维曼哈顿距离的简单证明

    对于在数轴上的 (n) 个点,要集合所有点于同一位置,使得移动的曼哈顿距离之和最小,那么应该选取哪个点呢? 设有 (n) 个点, (i) 点的位置为 (x_i) ,且有 (x_i …

    数据结构和算法 2023年6月7日
    075
  • LRU和LFU的实现

    LFU和 LRU是两种典型的缓存页面置换算法,了解其底层以及运行机制是CSer的必修课。 缓存是计算机中广泛应用的一种技术,包括CPU L1/L2/L3 cache,RAM中的ca…

    数据结构和算法 2023年6月8日
    0103
  • 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577

    给定一个二分图,其左右点的个数各为 (n),带权边数为 (m),保证存在完美匹配。 求一种完美匹配的方案,使得最终匹配边的边权之和最大。 二分图最大权完美匹配,一般用 (KM) 算…

    数据结构和算法 2023年6月7日
    079
  • 测试新博客

    第一篇文章 第一篇文章 第一篇文章 日期:2020.2.20 posted @2022-02-20 18:16 qingmuhe 阅读(41 ) 评论() 编辑 Original:…

    数据结构和算法 2023年6月8日
    075
  • [总结]2022-7-18模拟赛

    P1 赛时情况 开赛的时候比较冷静,但看完题目后就废了……先去打了T4的暴力。打的时候有些小细节想了很久,时间感不足,而且打代码速度不够快。 下次要果断,先…

    数据结构和算法 2023年6月8日
    082
  • 算法:银行中的激光束数量

    问题: 银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 …

    数据结构和算法 2023年6月12日
    079
  • [NOI2014] 起床困难综合症

    很明显是有关 二进制的的题 and 即 & (按位与) 二进制下同一位同为1,位运算后为1 例如 (1001 & 0111 = 0001) (1001) (&amp…

    数据结构和算法 2023年6月7日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球