Bridge(桥接)

Bridge(桥接) 结构型 对象 1

Intent_意图2

像抽象与实现分离,使其可以独立的变化

Motivation_动机3

提供抽象与实现之间的桥接,来实现解耦 ,使得实体类的功能能独立于接口实现类

Applicability_适用性4

1.当一个类存在两个独立变化的维度,且两个维度都需要进行扩展
2.当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加
3.当一个系统需要在构件的抽象化角色和具体化角色之间增加更多灵活性

Structure_结构5

在这里插入图片描述

Participants_参与者6

  • Abstration(抽象化) 定义抽象类,并包含一个对实现化对象的引用
  • RefinedAbstraction(扩展抽象化) 抽象化的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法
  • Implementor(实现化) 定义现实化角色的接口,供扩展抽象化角色调用
  • ConcreteImplementor(具体实现化) 给出实现化角色接口的具体实现

Collaborations_协作7

Comsequences_结果8

  • 优点
    将实现予以解耦,让它和界面之间不再永久绑定
    抽象和实现可以独立扩展,不会影响到对方
    对于“扩展的抽象类”所做的改变,不会影响到客户
  • 缺点
    桥接模式增加了复杂度
  • 用途
    适合使用在需要跨越多个平台的图形和窗口系统上
    当需要用不同的方式改变接口和实现时,桥接模式很好用

Implementation/Sample Code_实现/范例代码910

Abstraction

public abstract class Messager {
    MessageImplementor impl;    // 持有一个实现部分的对象

    /**
     * 构造方法,传入实现部分的对象
     * @param impl  实现部分的对象
     */
    public Messager(MessageImplementor impl) {
        this.impl = impl;
    }

    public void sendMessage(String message, String toUser) {
        impl.send(message, toUser);
    }
}

RefinedAbstraction

public class CommonMessager extends Messager {
    /**
     * 构造方法,传入实现部分的对象
     *
     * @param impl 实现部分的对象
     */
    public CommonMessager(MessageImplementor impl) {
        super(impl);
    }

    @Override
    // 普通信使直接调用父类方法发送消息
    public void sendMessage(String message, String toUser) {
        super.sendMessage(message, toUser);
    }
}
public class UrgencyMessager extends Messager {
    /**
     * 构造方法,传入实现部分的对象
     *
     * @param impl 实现部分的对象
     */
    public UrgencyMessager(MessageImplementor impl) {
        super(impl);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        message = "Urgency: " + message;
        super.sendMessage(message, toUser);
    }

    /**
     * 扩展加急信使功能,监控消息的处理状态
     * @param messageId 被监控消息编号
     * @return  监控消息处理状态
     */
    public Object watch(String messageId) {
        return null;
    }
}

Implementor

public interface MessageImplementor {
    void send(String message, String toUser);
}

ConcreteImplementor

public class MessageSMS implements MessageImplementor {
    @Override
    public void send(String message, String toUser) {
        System.out.println("Use SMS to send a message '" + message + "' to " + toUser);
    }
}
public class MessageEmail implements MessageImplementor {
    @Override
    public void send(String message, String toUser) {
        System.out.println("Use Email to send a message '" + message + "' to " + toUser);
    }
}

Demo

public class Client {
    public static void main(String[] args) {
        // 创建具体的实现对象
        MessageImplementor impl = new MessageSMS();
        // 创建普通信使对象
        Messager messager = new CommonMessager(impl);
        messager.sendMessage("it's a test", "Tester");
        messager = new UrgencyMessager(impl);
        messager.sendMessage("it's a test", "Tester");

        // 切换成邮件信使对象
        impl = new MessageEmail();
        messager = new CommonMessager(impl);
        messager.sendMessage("it's a test", "Tester");
        messager = new UrgencyMessager(impl);
        messager.sendMessage("it's a test", "Tester");
    }
}

Result

Use SMS to send a message 'it's a test' to tester
Use SMS to send a message 'Urgency: it's a test' to tester
Use Email to send a message 'it's a test' to tester
Use Email to send a message 'Urgency: it's a test' to tester

Known Uses_已知应用11

Related Patterns_相关模式12


  1. 模式分类归属 ↩︎

  2. 意图:描述该模式的作用,以及该模式的定义 ↩︎

  3. 动机:给出了问题以及如何解决这个问题的具体场景 ↩︎

  4. 适用性:描述模式可以被应用在什么场合 ↩︎

  5. 结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎

  6. 参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎

  7. 协作 :告诉参与者如何在此模式中合作 ↩︎

  8. 结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎

  9. 实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎

  10. 范例代码:提供代码的片段 ↩︎

  11. 已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎

  12. 相关模式:描述了此模式和其他模式之间的关系 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值