设计模式之桥接模式(Bridge模式)

2023-10-26

一、模式动机

设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:

        • 第一种设计方案是为每一种形状都提供一套各种颜色的版本。

  • 第二种设计方案是根据实际需要对形状和颜色进行组合。

 

对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。

当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。

二、桥接模式的定义

桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。通过上面的讲解,我们能很好的感觉到桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。

结构如下:

桥接模式包含如下角色:

    • Abstraction:抽象类

    • RefinedAbstraction:扩充抽象类

    • Implementor:实现类接口

    • ConcreteImplementor:具体实现类

三、具体实例

实例一:模拟毛笔

    • 现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。本实例使用桥接模式来模拟毛笔的使用过程。

   /// <summary>
    /// 定义颜色类接口
    /// </summary>
    public interface Color
    {
        void bepaint(String penType, String name);
    }
    /// <summary>
    /// 定义笔抽象类
    /// </summary>
    public abstract class Pen
    {
        protected Color color;
        public void setColor(Color color)
        {
            this.color = color;
        }
        public abstract void draw(String name);
    }

    //扩充抽象类
    public class SmallPen : Pen
    {
        public override void draw(String name)
        {
            String penType = "小号毛笔绘制";
            this.color.bepaint(penType, name);
        }

    }

    //扩充抽象类
    public class MiddlePen : Pen
    {
        public override void draw(String name)
        {
            String penType = "中号毛笔绘制";
            this.color.bepaint(penType, name);
        }
    }

    //扩充抽象类
    public class BigPen : Pen
    {
        public override void draw(String name)
        {
            String penType = "大号毛笔绘制";
            this.color.bepaint(penType, name);
        }
    }



    //扩充颜色类
    public class Red : Color
    {
        public void bepaint(String penType, String name)
        {
            Console.WriteLine(penType + "红色的" + name + ".");
        }
    }

    //扩充颜色类
    public class Green : Color
    {
        public void bepaint(String penType, String name)
        {
            Console.WriteLine(penType + "绿色的" + name + ".");
        }
    }

    // 扩充颜色类
    public class Blue : Color
    {
        public void bepaint(String penType, String name)
        {
            Console.WriteLine(penType + "蓝色的" + name + ".");
        }
    }

    //扩充实现类
    public class White : Color
    {
        public void bepaint(String penType, String name)
        {
            Console.WriteLine(penType + "白色的" + name + ".");
        }
    }


    public class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Color color1 = new Red();
                Pen pen = new SmallPen();
                pen.setColor(color1);
                pen.draw("鲜花");

                Color color2 = new Green();
                pen = new BigPen();
                pen.setColor(color2);
                pen.draw("叶子");
                Console.ReadKey();
            }
            catch (Exception e)
            {

            }
        }
    }

 

实例二:跨平台视频播放器

    • 如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、Unix等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。现使用桥接模式设计该播放器。

四、模式使用场景

  • 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
  • 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

五、总结

通过上面的讲解,我们能很好的感觉到桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。这里将桥接模式的优缺点总结如下。

桥接(Bridge)模式的优点是:

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明


缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

参考:

https://www.cnblogs.com/WindSun/p/10260547.html

http://c.biancheng.net/view/1364.html

https://www.runoob.com/w3cnote/bridge-pattern2.html

 

 

 

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

设计模式之桥接模式(Bridge模式) 的相关文章

  • Chain of Responsibility:责任链模式

    现有多个处理者 这些处理者可以处理不同的请求 这些处理者有等级关系 每个处理者都有更上级的处理者 对于最上级的处理者 可以没有上级 对于一个上级处理者 可以有多个下级处理者 客户端发出了一个请求 请求被传递给一个最下级处理者 而该处理者无法
  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • 常用设计模式总结

    设计模式的相关知识 很多书籍和博客中都有详细总结 本文总结的目的 1 将自己学习到的设计模式的知识按照自己的逻辑重新总结 方便查看和记忆 2 方便让自己对设计模式中常用的知识有一个系统的认知 设计模式 话设计模式 书中提到 24 种设计模式
  • python语法(高阶)-设计模式(单例模式)

    参考内容 黑马程序员
  • 离散仿真引擎基础作业与练习

    作业内容 一 简答题 1 解释 GameObjects 和 Assets 的区别与联系 2 下载几个游戏案例 分别总结资源 对象组织的结构 3 使用 debug 验证 MonoBehaviour 基本行为或事件触发条件 4 了解 GameO
  • 设计模式学习笔记(一)之单例模式

    单例模式 作用 保证一个类只有一个实例 并且提供访问这个实例的全局访问点 应用场景有 数据库连接池 spring中 Bean默认是单例 Servlet中 每一个Servlet是单例 配置文件的类 一般是单例 优点 单例只生成一个实例 减少系
  • 设计模式——原型模式

    原型模式顾名思义 就是指以某个实例为原型 copy出一个新的实例 该实例属性与原型相同或者是类似 很多时候 我们需要创建大量的相同或者相似的对象 如果一个个用new 构造函数的形式去创建的话比较繁琐 就像孙悟空要想变出成千上万个猴子猴孙总不
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • 设计模式一之简单工厂模式

    生活示例 刻板印刷 gt 活字印刷举例 喝酒唱歌 人生真爽 gt 对酒当歌 人生几何 可维护 需要修改 则只需要改需要改的字即可 可复用 字体可在后来的印刷复用 可扩展 需要加字 只需要加入相应的刻字即可 灵活性好 字的排列可能竖排或横排
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • 单例模式的八种写法比较

    单例模式是最常用到的设计模式之一 熟悉设计模式的朋友对单例模式都不会陌生 一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式 但是除了这两种方式 本文还会介绍其他几种实现单例的方式 让我们来一起看看吧 简介 单例模式是一种常
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • JavaScript设计模式-02-单例模式

    Javascript 设计模式 02 单例模式 简介 单例就是保证一个类只有一个实例 实现的方法一般是先判断实例是否存在 如果存在直接返回 如果不存在就创建了再返回 确保了一个类只有一个实例对象 在JavaScript里 单例作为一个命名空
  • 设计模式(不懂)

    面试中经常问到设计模式 我才对这个东西了解了一下 才发现他是没有开发的新大陆 是oo设计的更高级别 能把设计模式搞懂 那oo你就搞的差不多了 随便看了还是很有意思的 虽然不怎么懂 百科名片 相关书籍 设计模式 Design pattern
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并

随机推荐

  • 腾讯云网站备案流程(2023新版教程)

    腾讯云网站备案流程先填写基础信息 主体信息和网站信息 然后提交备案后等待腾讯云初审 初审通过后进行短信核验 最后等待各省管局审核 前面腾讯云初审时间1到2天左右 最长时间是等待管局审核时间 网站备案地区不同管局审核时间也不同 快的3天即可通
  • 条件编译#ifdef用法

    这几个宏是为了进行条件编译 一般情况下 源程序中所有的行都参加编译 但是有时希望对其中一部分内容只在满足一定条件才进行编译 也就是对一部 分内容指定编译的条件 这就是 条件编译 有时 希望当满足某条件时对一组语句进行编译 而当条件不满足时则
  • 最大连续和(单调队列)

    最大连续和 题目描述 给你一个长度为n的整数序列 A1 A2 An 要求从中找出一段连续的长度不超过m的子序列 使得这个序列的和最大 输入描述 第一行为两个整数n m 第二行为n个用空格分开的整数序列 每个数的绝对值都小于1000 输出描述
  • 向大侠们求救!!! 想要显示jsp页面时出现HTTP Status 500 - An exception occurred processing JSP page

    错误描述 HTTP Status 500 An exception occurred processing JSP page main jsp at line 23 type Exception report message An exce
  • java.lang.OutOfMemoryError: GC overhead limit exceeded原因及解决

    https www cnblogs com penghongwei p 3603326 html https blog csdn net renfufei article details 77585294 https www jb51 ne
  • linux查看 rsync 服务状态,如何启动rsync服务

    linux查看 rsync 服务状态 如何启动rsync服务 root localhost lsof i tcp 873 开启状态 未开启状态 启动rsync服务命令 root localhost rsync daemon config e
  • windows 10 内存居高不下,实际没开多少进程

    windows 10 内存居高不下 实际没开多少进程 关闭快速启动 就好了
  • 多进程及多线程的区别

    一 两者区别 多进程和多线程的主要区别是 线程是进程的子集 部分 一个进程可能由多个线程组成 多进程的数据是分开的 共享复杂 需要用IPC 但同步简单 多线程共享进程数据 共享简单 但同步复杂 1 多进程 进程是程序在计算机上的一次执行活动
  • Java-单链表相关总结

    链表基类 author Q sir date 2021 06 08 desc 仅限本类操作 有些方法未加兼容及拓展 class Node Node next int data public Node int data this data d
  • 【满分】【华为OD机试真题2023 JAVA&JS】简单的自动曝光

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 简单的自动曝光 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 一个图像有n个像素点 存储在一个长度为n的数组img里 每个像素点的取值范围 0 255 的正整数
  • Locust性能测试-分布式执行的方法(ok)

    来源 https www cnblogs com yoyoketang p 11681370 html https www cnblogs com kaibindirver p 11773334 html 前言 使用Locust进行性能测试
  • 腾讯云服务器被DDOS攻击解决办法

    腾讯云是国内仅此次阿里云的云服务商 很多站长朋友都使用他们家云服务器 自然被DDOS攻击的也不少 今天来介绍下使用腾讯云服务器被DDOS攻击的解决办法 一 购买腾讯高防IP 也称腾讯大禹BGP高防IP 是一个运行在腾讯云内网的高防IP服务
  • 第二章:简单古典密码(及其五元组)

    简单古典密码及其五元组 编制密码的基本原理和基本方法称为密码法 基本的密码法主要有移位 也称为置换 代替 和加减三种 在许多书上只是介绍置换和代替 在密码发展的初级阶段 他们都曾经独立地作为加密算法对明文信息进行加密 移位密码 移位密码是按
  • -bash: /big_date/jdk1.8.0_333/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录

    自说 在CentOS7中搭建环境中 解压过java1 8版本时 配置好环境变量进行测试java版本时出现以下错误 出现这种情况的原因是因为当前环境缺少相关依赖包 glibc glibc 简单来说 glibc是gnu发布的libc库 即c运行
  • 毕业设计-基于SSM的网上商城系统

    项目编号 D09 项目名称 基于SSM的网上商城系统 项目类型 Java web项目 JavaEE 当前版本 V1 0 0版本 用户类型 有用户和管理员 双角色 项目架构 B S架构 设计思想 MVC 开发语言 Java语言 前端技术 La
  • js——网址动态拼接参数

    案例 你可以使用字符串拼接的方式来动态拼接参数到网址上 在这种情况下 你可以使用加号运算符来连接字符串 并使用变量来表示参数的值 下面是一个示例代码 let aaa http www baidu com let xxx 1 let yyy
  • 对于一个采用字符数组存放的字符串str,设计一个递归算法StrLength(char *str)求其字符个数(长度)。递归求字符串长度

    递归求字符串长度 需要的就是将数组看成指针 一步一步走下去 int StrLength char str char p str if p 0 return 0 else return StrLength p 1 努力加油a啊 o
  • 走出软件作坊

    这本书 对于小开发者真的是实用手册 关于如何与老板相处 如何做人 如何做技术 对于在小企业工作的人来说 真的不错 2014 7 11
  • c#自定义消息事件

    自定义消息 public class CustomEventArgs EventArgs public readonly string msg public CustomEventArgs string msg this msg msg 自
  • 设计模式之桥接模式(Bridge模式)

    一 模式动机 设想如果要绘制矩形 圆形 椭圆 正方形 我们至少需要4个形状类 但是如果绘制的图形需要具有不同的颜色 如红色 绿色 蓝色等 此时至少有如下两种设计方案 第一种设计方案是为每一种形状都提供一套各种颜色的版本 第二种设计方案是根据