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
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎