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 桥接模式的资料请关注脚本之家其它相关文章!

相关文章

  • mybatisplus驼峰命名映射的问题解决

    mybatisplus驼峰命名映射的问题解决

    本文主要介绍了mybatisplus驼峰命名映射的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 简单了解spring bean作用域属性singleton和prototype的区别

    简单了解spring bean作用域属性singleton和prototype的区别

    这篇文章主要介绍了简单了解spring bean作用域属性singleton和prototype的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • springboot读取resource配置文件生成容器对象的示例代码

    springboot读取resource配置文件生成容器对象的示例代码

    这篇文章主要介绍了springboot读取resource配置文件生成容器对象的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • java中通用的线程池实例代码

    java中通用的线程池实例代码

    java中通用的线程池实例代码,需要的朋友可以参考一下
    2013-03-03
  • 详解SpringBoot如何使用JWT实现身份认证和授权

    详解SpringBoot如何使用JWT实现身份认证和授权

    JSON Web Token(JWT)是一种用于在网络应用之间安全传递信息的开放标准,本文主要为大家介绍了如何在Spring Boot中使用JWT实现身份认证和授权,需要的可以了解下
    2023-10-10
  • 使用svn管理Maven项目的方法步骤

    使用svn管理Maven项目的方法步骤

    这篇文章主要介绍了使用svn管理Maven项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java如何把map分割成多个map

    Java如何把map分割成多个map

    这篇文章主要介绍了Java如何把map分割成多个map,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • Java调用构造函数和方法及使用详解

    Java调用构造函数和方法及使用详解

    在Java编程中,构造函数用于初始化新创建的对象,而方法则用于执行对象的行为,构造函数在使用new关键字创建类实例时自动调用,没有返回类型,并且名称与类名相同,本文通过示例详细介绍了如何在Java中使用构造函数和方法,感兴趣的朋友一起看看吧
    2024-10-10
  • springcloud feign传输List的坑及解决

    springcloud feign传输List的坑及解决

    这篇文章主要介绍了springcloud feign传输List的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java将Word转换成PDF的常用用法

    Java将Word转换成PDF的常用用法

    Java开发人员在处理文档转换时,常常需要将Word或Excel文档转换为PDF格式,以便于更好地保持格式一致性、便于分发和打印,这篇文章主要给大家介绍了关于Java将Word转换成PDF的常用用法,需要的朋友可以参考下
    2024-08-08

最新评论