Java结构型设计模式之桥接模式详细讲解

 更新时间:2022年09月21日 15:23:29   作者:丨Jack_Chen丨  
桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下

桥接模式

概述

桥接模式(Bridge Pattern)也称为桥梁模式、接口(Interfce)模式或柄体(Handle and Body)模式,属于结构型模式。

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

桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥接模式的核心在于解耦抽象和实现。

应用场景

当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构隐定。

适用业务场景:

1.在抽象和具体实现之间需要增加更多的灵活性的场景。

2.一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。

3.不希望使用继承,或因为多层继承导致系统类的个数剧增。

优缺点

优点:

1.分离抽象部分及其具体实现部分

2.提高了系统的扩展性

3.实现细节对客户透明

缺点:

1.增加了系统的理解与设计难度

2.需要正确地识别系统中两个独立变化的维度

主要角色

1.抽象(Abstraction)

该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)。

2.修正抽象(RefinedAbstraction)

抽象的具体实现,对抽象的方法进行完善和扩展。

3.实现(Implementor)

确定实现维度的基本操作,提供给抽象使用。该类一般为接口或抽象类。

1.具体实现(Concretelmplementor)

实现的具体实现。

桥接模式的基本使用

创建实现角色

public interface IImplementor {
    void operationImpl();
}

创建具体实现角色

public class ConcreteImplementorA implements IImplementor {
    public void operationImpl() {
        System.out.println("ConcreteImplementorA operationImpl");
    }
}
public class ConcreteImplementorB implements IImplementor {
    public void operationImpl() {
        System.out.println("ConcreteImplementorB operationImpl");
    }
}

创建抽象角色

public abstract class Abstraction {
    protected IImplementor mImplementor;
    public Abstraction(IImplementor implementor) {
        this.mImplementor = implementor;
    }
    public void operation() {
        this.mImplementor.operationImpl();
    }
}

创建修正抽象角色

public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(IImplementor implementor) {
        super(implementor);
    }
    @Override
    public void operation() {
        super.operation();
        System.out.println("RefinedAbstraction operation");
    }
}

客户端调用

    public static void main(String[] args) {
        // 来一个实现化角色
        IImplementor impA = new ConcreteImplementorA();
        IImplementor impB = new ConcreteImplementorB();
        // 来一个抽象化角色,聚合实现
        Abstraction absA = new RefinedAbstraction(impA);
        Abstraction absB = new RefinedAbstraction(impB);
        // 执行操作
        absA.operation();
        absB.operation();
    }

ConcreteImplementorA operationImpl
RefinedAbstraction operation
ConcreteImplementorB operationImpl
RefinedAbstraction operation

桥接模式实现消息发送

使用桥接模式解耦消息类型与消息重要程度。

创建实现角色

创建实现角色,担任桥接角色,实现消息发送的统一接口

public interface IMessage {
    void send(String message);
}

创建具体实现角色

public class EmailMessage implements IMessage {
    @Override
    public void send(String message) {
        System.out.println("使用邮件消息发送" + message);
    }
}
public class SmsMessage implements IMessage {
    @Override
    public void send(String message) {
        System.out.println("使用短信消息发送" + message);
    }
}

创建抽象角色

创建抽象角色,担任桥接抽象角色,持有实现角色,且发送消息委派给实现对象发送

public abstract class AbastractMessage {
    // 持有实现角色的引用
    private IMessage message;
    // 构造函数,传入实现角色的引用
    public AbastractMessage(IMessage message) {
        this.message = message;
    }
    // 发送消息的方法,调用实现角色的方法
    void sendMessage(String message){
        this.message.send(message);
    }
}

创建修正抽象角色

创建普通消息

public class NomalMessage extends AbastractMessage {
    public NomalMessage(IMessage message) {
        super(message);
    }
}

创建重要消息

public class ImportanceMessage extends AbastractMessage {
    public ImportanceMessage(IMessage message) {
    	message = message + "【重要消息】";
        super(message);
    }
    void sendMessage(String message){
        super.sendMessage(message);
    }
}

客户端调用

    public static void main(String[] args) {
        IMessage message = new EmailMessage();
        AbastractMessage abastractMessage = new NomalMessage(message);
        abastractMessage.sendMessage("hello world");
        message = new SmsMessage();
        abastractMessage = new ImportanceMessage(message);
        abastractMessage.sendMessage("hello world");
    }

使用邮件消息发送hello world
使用短信消息发送hello world【重要消息】

到此这篇关于Java结构型设计模式之桥接模式详细讲解的文章就介绍到这了,更多相关Java桥接模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA2020.3创建web工程的完整步骤

    IDEA2020.3创建web工程的完整步骤

    这篇文章主要给大家介绍了关于IDEA2020.3创建web工程的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • RabbitMQ交换机使用场景和消息可靠性总结分析

    RabbitMQ交换机使用场景和消息可靠性总结分析

    这篇文章主要为大家介绍了RabbitMQ交换机使用场景和消息可靠性总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 通过springboot+mybatis+druid配置动态数据源

    通过springboot+mybatis+druid配置动态数据源

    这篇文章主要介绍了通过springboot+mybatis+druid配置动态数据源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • Spring Boot中是如何处理日期时间格式的

    Spring Boot中是如何处理日期时间格式的

    这篇文章主要介绍了Spring Boot中是如何处理日期时间格式的,帮助大家更好的理解和学习spring boot框架,感兴趣的朋友可以了解下
    2020-11-11
  • 基于Java实现的Base64加密、解密原理代码

    基于Java实现的Base64加密、解密原理代码

    这篇文章主要介绍了基于Java实现的Base64加密、解密原理代码,需要的朋友可以参考下
    2014-07-07
  • SpringBoot整合Hutool实现文件上传的使用示例

    SpringBoot整合Hutool实现文件上传的使用示例

    文件上传在项目经常会用到,本文主要介绍了SpringBoot整合Hutool实现文件上传的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 如何在spring boot中进行参数校验示例详解

    如何在spring boot中进行参数校验示例详解

    这篇文章主要介绍了如何在spring-boot中进行参数校验及lombok的使用详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Java Calendar类使用案例详解

    Java Calendar类使用案例详解

    这篇文章主要介绍了Java Calendar类使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 使用Spring Boot的原因解析

    使用Spring Boot的原因解析

    Spring Boot是Spring家族的成员,它是一个全新的框架,它的设计目的是尽可能简单和快速的开发、运行Spring应用程序,简化配置,这篇文章主要介绍了为什么使用Spring Boot,需要的朋友可以参考下
    2022-07-07
  • IntelliJ IDEA失焦自动重启服务的解决方法

    IntelliJ IDEA失焦自动重启服务的解决方法

    在使用 IntelliJ IDEA运行 SpringBoot 项目时,你可能会遇到一个令人困扰的问题,一旦你的鼠标指针离开当前IDE窗口,点击其他位置时, IDE 窗口会失去焦点,你的 SpringBoot 服务就会自动重启,所以本文给大家介绍了IntelliJ IDEA失焦自动重启服务的解决方法
    2023-10-10

最新评论