桥接模式(Bridge Pattern)

这篇具有很好参考价值的文章主要介绍了桥接模式(Bridge Pattern)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模式动机

桥接模式(Bridge Pattern)是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使得两者可以独立扩展。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多重继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效地控制了系统中类的个数。

模式定义

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  • 对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式
  • 用抽象关联取代了传统的多层继承
  • 将类之间的静态继承关系转换为动态的对象组合关系

模式结构

桥接模式(Bridge Pattern)

案例实现

案例背景

毛笔:颜色和型号实现了分离,增加新的颜色或者型号对另一方没有任何影响

案例结构

桥接模式(Bridge Pattern)

代码实现

抽象类

public abstract class Pen {

    protected Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw(String name);
}

细化抽象类

public class BigPen extends Pen {
    @Override
    public void draw(String name) {
        String penType = "大号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}
public class MiddlePen extends Pen {

    @Override
    public void draw(String name) {
        String penType = "中号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}
public class SmallPen extends Pen {
    @Override
    public void draw(String name) {
        String penType = "小号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}

接口

public interface Color {
    //用于图形着色的方法
    void bepaint(String penType,String name);

}

接口实现类

public class Red implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"红色的"+name+".");
    }
}

public class White implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"白色的"+name+".");
    }
}

public class Green implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"绿色的"+name+".");
    }
}

public class Blue implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"蓝色的"+name+".");
    }
}

public class Black implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"黑色的"+name+".");
    }
}

客户类

public class Client {

    public static void main(String[] args) {

        Color color;
        Pen pen;
        color = (Color) XMLUtilPen.getBean("color");
        pen = (Pen) XMLUtilPen.getBean("pen");

        pen.setColor(color);
        pen.draw("鲜花");

    }

}

实现结果

桥接模式(Bridge Pattern)

模式分析

  • 桥接模式中体现了很多OOP的思想,包括开闭原则合成复用原则里氏代换原则依赖倒转原则等。
  • 桥接模式可以从接口中分离实现功能,设计更具有扩展性。
  • 桥接模式减少了子类个数,代码简洁。
  • 重点理解如何将抽象化(Abstraction)和实现化(Implementation)脱耦,使得两者可以独立变化。
  • 脱耦
    • 抽象化和实现化之间的耦合解开,或者说是将强关联改换成弱关联,将两个角色之间的继承关系改为关联关系
    • 桥接模式中的所谓脱耦就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合)而不是继承关系,从而使得两者可以相对独立地变化。
    • 继承是强耦合关系。

总结

模式优点

  • 分离抽象接口及其实现部分
  • 可以取代多层继承方案,极大地减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

模式缺点

  • 会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就要针对抽象层进行设计与编程
  • 正确识别出系统中两个独立变化的维度并不是一件容易的事情

应用情形

  • 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
  • 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统

模式扩展

桥接模式与适配器模式经常联合使用,适配器模式可以解决两个已有接口间不兼容的问题,适配器采用增加适配器的方式将第三方类集成到系统中;而桥接模式则通过接口继承或者类继承的方式对系统进行扩展。两个模式用于设计的不同阶段,通常情况下桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化。初步设计完成后,当发现系统与已有类无法协同工作时,可以采用适配器模式。文章来源地址https://www.toymoban.com/news/detail-453246.html

到了这里,关于桥接模式(Bridge Pattern)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin~Bridge桥接模式

    概念 抽象和现实之间搭建桥梁,分离实现和抽象。 抽象(What) 实现(How) 用户可见 系统正常工作的底层代码 产品 付款方式 定义数据类型的类。 处理数据存储和检索的类 角色介绍 Abstraction:抽象 定义抽象接口,通常包含对实现接口的引用。 Refined Abstraction:扩展抽象,

    2024年02月12日
    浏览(34)
  • C++设计模式-桥接(Bridge)

    目录 C++设计模式-桥接(Bridge) 一、意图 二、适用性 三、结构 四、参与者 五、代码 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择

    2024年02月07日
    浏览(42)
  • 《golang设计模式》第二部分·结构型模式-02-桥接模式(Bridge)

    桥(Bridge)使用组合关系将代码的实现层和抽象层分离,让实现层与抽象层代码可以分别自由变化。 例如 客户端调用桥接接口实现原有功能和扩展功能的组合 Implementor(实施者): 具体实施者的抽象,可以是一个接口。 Concrete Implementor(具体实施者): 可以理解为扩展之前

    2024年02月12日
    浏览(41)
  • 【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图 【对应类图】 【分析】 扩展性问题(类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。 违

    2024年02月15日
    浏览(40)
  • Bridge Pattern

    桥接模式(Bridge Pattern),旨在将抽象部分和实现部分解耦,使它们可以独立地变化。该模式通过将抽象和实现分离,使它们可以独立地进行扩展和修改,同时通过桥接(Bridge)将它们连接起来。 将一个事物原本耦合在一起的东西,通过定义成抽象和实现两个维度,做到解耦

    2024年02月10日
    浏览(31)
  • Strimzi Kafka Bridge(桥接)实战之一:简介和部署

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 在strimzi技术体系中,桥接(bridge)是很要的功能,内容也很丰富,因此将桥接相关的内容从《strimzi实战》系列中独立出来,成立桥接相关的系列文章,便于分类和专项深入 本文是《Strimzi Kafka Bridge(桥

    2024年02月08日
    浏览(35)
  • Strimzi Kafka Bridge(桥接)实战之二:生产和发送消息

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本文是《Strimzi Kafka Bridge(桥接)实战之》系列的第二篇,咱们直奔bridge的重点:常用接口,用实际操作体验如何用bridge完成常用的消息收发业务 官方的openapi接口文档地址 : https://strimzi.io/docs/bridge/in

    2024年02月08日
    浏览(44)
  • 设计模式之Bridge模式的C++实现

    目录 1、Bridge模式的提出 2、Bridge模式的定义 3、Bridge模式总结 4、需求描述 5、多继承方式实现 6、使用Bridge设计模式实现         在软件功能模块设计中,如果类的实现功能划分不清晰,使得继承得到的子类往往是随着需求的变化,子类急剧膨胀,充斥重复代码。将类要实现

    2024年02月13日
    浏览(45)
  • 配置Bridge模式KVM虚拟机

    配置Bridge模式KVM虚拟机 1. 配置基本环境 1 安装软件包。 安装brctl和tunctl命令行工具,要采用Bridge模式的网络配置,首先需要安装两个RPM包,即bridge-utils和tunctl,它们提供所需的brctl和tunctl命令行工具。可以用yum工具安装这两个RPM包。 #yum install bridge-utils -y #yum -y localinstall t

    2024年02月01日
    浏览(36)
  • Docker中的bridge模式,可以这么设置

    最近有几个已经就业的小伙伴,过来问千锋健哥关于Docker网络配置的问题,他们在实际开发中还是有些疑问。关于Docker网络这一块的内容确实很多,为了让大家搞清楚这个问题,健哥准备搞几篇系列文章,来为各位小伙伴解惑。这次健哥带来的是Docker网络的Bridge模式,接下来

    2023年04月24日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包