本文源码:GitHub·点这里 || GitEE·点这里

一、桥接模式简介

1、基础描述

桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。

2、场景问题描述

1)、场景分析

在一个复杂的系统中,消息通知是一个必备模块,一般封装方式主要从下面两个方式入手:

  • 消息类型
用户端消息(user-client)管理端消息(system-client)
  • 消息接收
邮件发送(email)短信发送(msg)

2)、场景图解

08_1

3)、源码实现

/** * 桥接模式场景应用 */public class C01_InScene {    public static void main(String[] args) {        // 创建具体的实现对象        MsgImplementor implementor = new SendBySMS() ;        // 创建普通的消息对象        AbstractMsg abstractMessage = new UserMsg(implementor);        abstractMessage.sendMessage("您的账户异地登陆", "用户A0001");        // 切换为邮件方式且加急处理        implementor = new SendByEmail() ;        abstractMessage = new AdminMsg(implementor);        abstractMessage.sendMessage("项目上线通知", "运维S0001");    }}/** * 封装消息类型 */abstract class AbstractMsg {    // 持有一个实现部分的对象    MsgImplementor impl ;    public AbstractMsg (MsgImplementor impl){        this.impl = impl ;    }    /**     * 发送消息,委派给实现部分的方法     * @param message    要发送消息的内容     * @param toUser    消息的接受者     */    public void sendMessage (String message, String toUser){        this.impl.send(message, toUser);    }}class AdminMsg extends AbstractMsg{    public AdminMsg(MsgImplementor impl) {        super(impl);    }    @Override    public void sendMessage(String message, String toUser) {        message = "辛苦的管理员:"+message;        super.sendMessage(message, toUser);    }}class UserMsg extends AbstractMsg{    public UserMsg(MsgImplementor impl) {        super(impl);    }    @Override    public void sendMessage(String message, String toUser) {        message = "尊敬的用户:" + message ;        super.sendMessage(message, toUser);    }}/** * 封装消息发送 */interface MsgImplementor {    void send (String message , String toUser) ;}class SendBySMS implements MsgImplementor{    @Override    public void send(String message, String toUser) {        System.out.println("短信通知:"+toUser+";内容:"+message);    }}class SendByEmail implements MsgImplementor{    @Override    public void send(String message, String toUser) {        System.out.println("邮件通知:"+toUser+";内容:"+message);    }}

二、桥接模式

1、模式图解

08_2

2、核心角色

  • 抽象化(Abstraction)角色

抽象化给出的定义,并保存一个对实现化对象的引用。

  • 修正抽象化(RefinedAbstraction)角色

扩展抽象化角色,改变修正父类对抽象化的定义。

  • 实现化(Implementor)角色

这个角色给出实现化角色的接口,但不给出具体的实现。

  • 具体实现化(ConcreteImplementor)角色

这个角色给出实现化角色接口的具体实现。

3、源码封装

abstract class Abstraction {    private Implementor implementor  ;    public Abstraction (Implementor implementor){        this.implementor = implementor ;    }    // 实例方法    public void operation (){        implementor.operationImpl();    }}class RefinedAbstraction extends Abstraction{    public RefinedAbstraction(Implementor implementor) {        super(implementor);    }    //其他的操作方法    public void otherOperation(){    }}abstract class Implementor {    // 示例方法,实现抽象部分需要的某些具体功能    public abstract void operationImpl () ;}class ConcreteImplementorA extends Implementor{    @Override    public void operationImpl() {        System.out.println("ConcreteImplementorA.operationImpl()");    }}class ConcreteImplementorB extends Implementor{    @Override    public void operationImpl() {        System.out.println("ConcreteImplementorB.operationImpl()");    }}

三、Java应用场景

桥梁模式在Java应用中的一个非常典型的例子就是JDBC驱动器。抽象API可以对各种数据库引擎发出SQL指令,并不直接与数据库引擎互动,JDBC驱动器负责这个底层的工作。

08_3

JDBC的这种架构,把抽象部分和具体部分分离开来,从而使得抽象部分和具体部分都可以独立地扩展。

四、源代码地址

GitHub·地址https://github.com/cicadasmile/model-arithmetic-parentGitEE·地址https://gitee.com/cicadasmile/model-arithmetic-parent
收藏 打印