桥接模式解密:跨越鸿沟,桥接抽象与实现

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

一、概要

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独⽴的变化。其核心思想就是解耦,在面向对象编程中,抽象和实现是通过继承关系来实现的,但这种关系是静态的,不能在运行时动态改变,而桥接模式是通过组合关系来取代继承关系,从而实现抽象部分和实现部分之间的解耦,提高系统的灵活性和可维护性。对应现实生活,它把一件事物分成两个维度,这两个维度可以独立进行扩展,维度之间通过桥接进行关联。

比如生活中的支付场景,要完成一次支付,首先你要考虑使用哪种支付平台,用微信支付还是支付宝支付。选定平台后,如何去支付,是用密码支付,还是指纹支付。在这种场景下,支付平台和支付方式就是事物的两个维度,分别对应抽象层和实现层,这两个维度可以独立变化,独立扩展。最后通过一个桥接结构将两个维度进行关联,所有的支付情景就是两个维度子项的笛卡尔积。很显然,通过桥接模式可以避免建立这个“积”数量个的类继承关系。

桥接模式解密:跨越鸿沟,桥接抽象与实现

1.1 优点

  • 分离抽象和实现,降低系统的耦合度,提升系统的扩展性。
  • 符合开闭原则,即对扩展开放,对修改关闭。
  • 隐藏具体实现细节,使得系统更加安全,更加稳定。
  • 细化控制,桥接模式允许在运行时动态地选择具体实现,提供更大的灵活性和自由度。

1.2 缺点

  • 增加系统复杂性,桥接模式需要引入抽象部分和实现部分的抽象类和具体实现类,会增加类的数量,同时需要管理抽象部分和实现部分之间的关联关系。
  • 增加系统的理解与设计难度,增加开发工作量。

1.3 适用场景

  • 当需要分离抽象部分和实现部分,降低系统耦合时,可以使用桥接模式。

  • 当希望在抽象部分和实现部分之间建立灵活的组合关系,避免在两个层次之间建立静态继承时。

  • 当一个事物存在两个独立变化的维度,且这两个维度都需要进行扩展,适合使用桥接模式。

  • 对于那些不希望因使用继承或多层次继承导致类数量爆炸增长的系统,桥接模式也尤为适用。

二、模拟支付场景

对于上述的支付场景,无论支付平台以及支付方式如何扩展,我们都可以通过桥接模式来组合系统中的所有支付情景。
系统总体结构如下:

桥接模式解密:跨越鸿沟,桥接抽象与实现

步骤1:模拟支付方式接口PayMode和其两大实现

public interface PayMode {
    void paymode();
}
public class PasswordPay implements PayMode{
    @Override
    public void paymode() {
        System.out.println("--用密码支付");
    }
}
public class FingerPay implements PayMode{
    @Override
    public void paymode() {
        System.out.println("--用指纹支付");
    }
}

步骤2:创建抽象类Pay,和两大支付平台实现类

Tip:这里创建的是抽象类Pay而不是接口,因为需要在类中持有PayMode的引用,这个引用就是所谓的“桥”。还需要注意一点,payMode访问修饰符为protected,方便继承给子类。

public abstract class Pay {
    
    protected PayMode paymode;
    
    public Pay(PayMode paymode) {
        this.paymode = paymode;
    }
    public abstract void pay();
}
public class WechatPay extends Pay{

    public WechatPay(PayMode paymode) {
        super(paymode);
    }

    @Override
    public void pay() {
        System.out.println("微信支付:");
        paymode.paymode();
    }
}
public class AliPay extends Pay{

    public AliPay(PayMode paymode) {
        super(paymode);
    }

    @Override
    public void pay() {
        System.out.println("支付宝支付:");
        paymode.paymode();
    }
}

步骤3:客户端测试

public class Client {
    public static void main(String[] args) {
        Pay wechatPay1=new WechatPay(new PasswordPay());
        Pay wechatPay2=new WechatPay(new FingerPay());
        wechatPay1.pay();
        wechatPay2.pay();

        System.out.println();

        Pay aliPay1=new AliPay(new PasswordPay());
        Pay aliPay2=new AliPay(new FingerPay());
        aliPay1.pay();
        aliPay2.pay();
    }
}

测试结果

桥接模式解密:跨越鸿沟,桥接抽象与实现

三、总结

本文详细讲解了桥接模式的原理和实现,通过模拟经典的支付场景,让你进一步加深对桥接模式的理解。总的来说,桥接模式在将抽象和实现解耦、提高系统的可扩展性和灵活性方面非常有用。然而,桥接模式的引入会增加系统的理解与设计难度,在设计阶段应根据实际需求和系统的复杂度来评估是否使用桥接模式。

希望这篇文章对你的学习有所帮助!如果你觉得这篇文章对你有帮助,请不要吝啬你的赞美和分享。在此感谢你的阅读,我们下次再见!

桥接模式解密:跨越鸿沟,桥接抽象与实现文章来源地址https://www.toymoban.com/news/detail-478647.html

到了这里,关于桥接模式解密:跨越鸿沟,桥接抽象与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python实现抽象工厂模式

    抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖对象的家族,而无需指定具体类。在Python中,可以通过类和接口的组合来实现抽象工厂模式。 下面是一个简单的Python实现抽象工厂模式的示例: 在上面的示例中,我们定义了抽象产品接口 AbstractProductA 和 Abs

    2024年02月16日
    浏览(43)
  • 用Rust实现23种设计模式之桥接模式

    桥接模式的优点: 桥接模式的设计目标是将抽象部分和实现部分分离,使它们可以独立变化。这种分离有以下几个优点: 解耦和灵活性 :桥接模式可以将抽象部分和实现部分解耦,使它们可以独立地变化。这样,对于抽象部分的修改不会影响到实现部分,反之亦然。这种解

    2024年02月14日
    浏览(49)
  • 抽象工厂设计模式go实现尝试

    本文章尝试使用go实现“抽象工厂”。 新人设计模式理解,望大家多多指点。

    2024年02月16日
    浏览(52)
  • 【设计模式】Head First 设计模式——抽象工厂模式 C++实现

    设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。 提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具

    2024年02月10日
    浏览(43)
  • 用Rust实现23种设计模式之抽象工厂

    在 Rust 中,可以使用 trait 和泛型来实现抽象工厂模式。抽象工厂模式是一种创建型设计模式,它提供了一个接口来创建一系列相关或依赖对象的家族,而无需指定具体的类。下面是一个简单的示例,展示了如何使用 Rust 实现抽象工厂模式: 在上述示例中,我们首先定义了抽

    2024年02月14日
    浏览(61)
  • 桥接模式:如何实现支持不同类型和渠道的消息推送系统?

            上一节课我们学习了第一种结构型模式:代理模式。它在不改变原始类(或者叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。代理模式在平时的开发经常被用到,常用在业务系统中开发一些非功能性需求,比如:监控、统计、鉴权、限流、事务

    2024年02月15日
    浏览(42)
  • [Lua] 探讨类与对象机制的实现、并实现抽象工厂模式

    Lua 没有严格的 oo(Object-Oriented)定义,可以利用元表特性来实现 先定义所有类的基类,即 Object 类。代码顺序从上到下,自成一体。完整代码 定义一个空表 Object , __index 指向其自身(继承将直接使用该表作为对象的元表) new 定义构造对象时的初始化行为,相当于 构造器

    2024年02月09日
    浏览(33)
  • [设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式

    前言: 为什么之前写过Golang 版的设计模式,还在重新写 Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那

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

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

    2024年02月15日
    浏览(43)
  • 解密prompt系列26. 人类思考vs模型思考:抽象和发散思维

    在Chain of Thought出来后,出现过许多的优化方案例如Tree of thought, Graph of Thought, Algorithm of Thought等等,不过这些优化的出发点都更加\\\"Machine Like\\\",而非\\\"Human Like\\\", 哈哈不是说机器化不好,仅仅是对AGI的一些个人偏好而已。 所以如果我们从人类思考的角度出发,能否把当前模型的思

    2024年03月10日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包