Java设计模式之桥接模式详解

 更新时间:2023年07月03日 10:25:21   作者:程序员皮卡秋  
桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分和实现部分`分离开来,从而使它们可以独立地进行变化,本节给大家讲一下设计模式中的桥接模式,并结合实际业务场景给大家讲解如何使用,需要的朋友可以参考下

桥接模式

桥接模式(Bridge Pattern)``是一种结构型设计模式,用于将抽象部分实现部分`分离开来,从而使它们可以独立地进行变化。这种模式通过将抽象部分与实现部分解耦,使得它们可以独立地进行扩展、修改和重用。

在桥接模式中,抽象部分和实现部分分别由两个层次结构来实现。抽象部分定义了对外提供的接口和方法,而实现部分则提供了具体的实现细节。通过将抽象部分和实现部分解耦,我们可以在不影响系统稳定性的前提下对其进行修改和扩展。

举个例子,假设我们正在开发一个跨平台的音乐播放器,它可以在 Windows、Mac、Linux 等多种操作系统上运行。由于不同的操作系统之间存在很大的差异,因此我们需要针对每种操作系统编写不同的实现代码。在这种情况下,我们可以使用桥接模式来将抽象部分和实现部分分离开来。

首先,我们定义一个抽象类 MediaPlayer,它定义了播放器的基本接口和方法:

public abstract class MediaPlayer {
    protected OperatingSystem operatingSystem;
    public MediaPlayer(OperatingSystem operatingSystem) {
        this.operatingSystem = operatingSystem;
    }
    public abstract void play();
}

其中,OperatingSystem 是一个抽象类,定义了不同操作系统之间的共同特征:

public abstract class OperatingSystem {
    public abstract String getName();
}

接下来,我们定义不同操作系统的具体实现类,例如 Windows、Mac 和 Linux

public class Windows extends OperatingSystem {
    @Override
    public String getName() {
        return "Windows";
    }
}
public class Mac extends OperatingSystem {
    @Override
    public String getName() {
        return "Mac";
    }
}
public class Linux extends OperatingSystem {
    @Override
    public String getName() {
        return "Linux";
    }
}

最后,我们定义不同操作系统下的具体播放器实现类,例如 WindowsMediaPlayer、MacMediaPlayer 和 LinuxMediaPlayer

public class WindowsMediaPlayer extends MediaPlayer {
    public WindowsMediaPlayer(OperatingSystem operatingSystem) {
        super(operatingSystem);
    }
    @Override
    public void play() {
        System.out.println("Playing on " + operatingSystem.getName() + " using WindowsMediaPlayer.");
    }
}
public class MacMediaPlayer extends MediaPlayer {
    public MacMediaPlayer(OperatingSystem operatingSystem) {
        super(operatingSystem);
    }
    @Override
    public void play() {
        System.out.println("Playing on " + operatingSystem.getName() + " using MacMediaPlayer.");
    }
}
public class LinuxMediaPlayer extends MediaPlayer {
    public LinuxMediaPlayer(OperatingSystem operatingSystem) {
        super(operatingSystem);
    }
    @Override
    public void play() {
        System.out.println("Playing on " + operatingSystem.getName() + " using LinuxMediaPlayer.");
    }
}

比如在mac平台下可以这么调用

public class BridgeTest {
    public static void main(String[] args) {
        MediaPlayer player = new MacMediaPlayer(new Mac());
        player.play();
        // Playing on Mac using MacMediaPlayer.
    }
}

桥接模式的优点有:

  • 提高可扩展性:桥接模式将抽象部分与实现部分分离,使它们可以分别变化。这样,当增加一个新的实现时,就不需要修改抽象部分和其他实现部分了,只需要添加一个新的实现即可。

  • 降低耦合度:桥接模式将抽象部分与实现部分分离,使它们可以独立变化,从而降低了它们之间的耦合度。这使得系统更易于维护和扩展。

  • 更好的分离抽象与实现:桥接模式提供了一个更好的分离抽象与实现的方式,使得抽象与实现可以独立变化。这使得系统更具灵活性、可扩展性和可维护性。

是不是比你if/else好太多~

最佳实践

假设我们正在开发一个电商平台,以下是订单处理的桥接模式的实现:

首先,定义一个抽象类 Order,它有一个抽象方法 process()

public abstract class Order {
    protected OrderProcessor orderProcessor;
    public Order(OrderProcessor orderProcessor) {
        this.orderProcessor = orderProcessor;
    }
    public abstract void process();
}

然后,定义两个具体的订单类 NormalOrder 和 RushOrder,它们继承自 Order

public class NormalOrder extends Order {
    public NormalOrder(OrderProcessor orderProcessor) {
        super(orderProcessor);
    }
    @Override
    public void process() {
        orderProcessor.processNormalOrder();
    }
}
public class RushOrder extends Order {
    public RushOrder(OrderProcessor orderProcessor) {
        super(orderProcessor);
    }
    @Override
    public void process() {
        orderProcessor.processRushOrder();
    }
}

接下来,定义一个抽象类 OrderProcessor,它有两个抽象方法 processNormalOrder() 和 processRushOrder()

public abstract class OrderProcessor {
    public abstract void processNormalOrder();
    public abstract void processRushOrder();
}

然后,定义两个具体的订单处理类 OnlineOrderProcessor 和 OfflineOrderProcessor,它们继承自 OrderProcessor

public class OnlineOrderProcessor extends OrderProcessor {
    @Override
    public void processNormalOrder() {
        System.out.println("在线订单处理普通订单");
    }
    @Override
    public void processRushOrder() {
        System.out.println("在线订单处理加急订单");
    }
}
public class OfflineOrderProcessor extends OrderProcessor {
    @Override
    public void processNormalOrder() {
        System.out.println("线下订单处理普通订单");
    }
    @Override
    public void processRushOrder() {
        System.out.println("线下订单处理加急订单");
    }
}

最后,在客户端中,可以根据需要创建不同的订单对象和订单处理对象,并将它们桥接起来:

public class BridgeTest {
    public static void main(String[] args) throws Exception {
        OrderProcessor onlineOrderProcessor = new OnlineOrderProcessor();
        OrderProcessor offlineOrderProcessor = new OfflineOrderProcessor();
        Order normalOnlineOrder = new NormalOrder(onlineOrderProcessor);
        Order rushOnlineOrder = new RushOrder(onlineOrderProcessor);
        Order normalOfflineOrder = new NormalOrder(offlineOrderProcessor);
        Order rushOfflineOrder = new RushOrder(offlineOrderProcessor);
        normalOnlineOrder.process();
        rushOnlineOrder.process();
        normalOfflineOrder.process();
        rushOfflineOrder.process();
    }
}

输出:

在线订单处理普通订单
在线订单处理加急订单
线下订单处理普通订单
线下订单处理加急订单

结束语

设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。

以上就是Java设计模式之桥接模式代码示例的详细内容,更多关于Java 桥接模式的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Spring Boot最核心的27个注解,你了解多少?

    详解Spring Boot最核心的27个注解,你了解多少?

    这篇文章主要介绍了详解Spring Boot最核心的27个注解,你了解多少?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • IDEA调试小技巧之Evaluate调试工具详解

    IDEA调试小技巧之Evaluate调试工具详解

    这篇文章主要介绍了IDEA调试小技巧之Evaluate调试工具,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • spring boot+mybatis-plus配置读写分离的操作

    spring boot+mybatis-plus配置读写分离的操作

    这篇文章主要介绍了spring boot+mybatis-plus配置读写分离的操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 一文详解如何查看jdk版本及安装路径

    一文详解如何查看jdk版本及安装路径

    这篇文章主要给大家介绍了关于如何查看jdk版本及安装路径的相关资料,JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • JavaFX实现拖拽结点效果

    JavaFX实现拖拽结点效果

    这篇文章主要为大家详细介绍了JavaFX实现拖拽结点效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • SpringBoot redis分布式缓存实现过程解析

    SpringBoot redis分布式缓存实现过程解析

    这篇文章主要介绍了SpringBoot redis分布式缓存实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 关于Java的Character类详解

    关于Java的Character类详解

    这篇文章主要介绍了关于Java的Character类详解,Java中的Character类是一个包装类,用于封装一个基本数据类型char的值,它提供了一些静态方法来操作字符,需要的朋友可以参考下
    2023-05-05
  • 详解java线程的开始、暂停、继续

    详解java线程的开始、暂停、继续

    本文将介绍通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。具有一定的参考作用,下面跟着小编一起来看下吧
    2017-01-01
  • 一文详解MQ消息丢失问题的5种解决方案

    一文详解MQ消息丢失问题的5种解决方案

    有些小伙伴在工作中,一提到消息队列就觉得很简单,但真正遇到线上消息丢失时,排查起来却让人抓狂,今天这篇文章,专门跟大家一起聊聊这个话题,希望对你会有所帮助
    2025-10-10
  • springboot接入mq的方法示例

    springboot接入mq的方法示例

    本文主要介绍了springboot接入mq的方法示例,主要实现配置以及实现一个简单的发送、接收消息的例子,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论