定义
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
包含角色:
- Abstraction:抽象类
- RefinedAbstraction:扩充抽象类
- Implementor:实现类接口
- ConcreteImplementor:具体实现类
优缺点
优点:
- 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 实现细节对客户透明,可以对用户隐藏实现细节。
缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
实例
OA 系统中流程传递需要发送消息提醒用户,消息的级别也有普通、紧急区分。
发送方式有邮件、短信等。
消息发送接口:
public interface IMessageImplementor {
void send(String toUser, String message);
}
消息发送实现类:
public class MessageSMS implements IMessageImplementor {
@Override
public void send(String toUser, String message) {
System.out.println(String.format("短信发送至:%s内容为:%S",toUser,message));
}
}
public class MessageEmail implements IMessageImplementor {
@Override
public void send(String toUser, String message) {
System.out.println(String.format("邮件发送至:%s内容为:%S",toUser,message));
}
}
消息抽象类:
public abstract class AbstractMessage {
private IMessageImplementor implementor;
public AbstractMessage(IMessageImplementor implementor){
this.implementor = implementor;
}
public void sendMessage(String toUser , String message){
this.implementor.send(toUser,message);
}
}
实际消息类:
public class CommonMessage extends AbstractMessage{
public CommonMessage(IMessageImplementor implementor) {
super(implementor);
}
}
public class UrgentMessage extends AbstractMessage{
public UrgentMessage(IMessageImplementor implementor) {
super(implementor);
}
@Override
public void sendMessage(String toUser, String message) {
// 实现紧急消息自己的逻辑
String urgentMessage = "紧急:"+message;
super.sendMessage(toUser, urgentMessage);
}
}
调用:
public static void main(String[] args) {
IMessageImplementor messageSMS = new MessageSMS();
IMessageImplementor messageEmail = new MessageEmail();
// 普通消息 + 邮件发送
AbstractMessage commonMessage1 = new CommonMessage(messageEmail);
commonMessage1.sendMessage("MarkLogZhu","test");
// 普通消息 + 短信发送
AbstractMessage commonMessage2 = new CommonMessage(messageSMS);
commonMessage2.sendMessage("MarkLogZhu","test");
// 紧急消息 + 邮件发送
AbstractMessage urgentMessage1 = new UrgentMessage(messageEmail);
urgentMessage1.sendMessage("MarkLogZhu","test");
// 紧急消息 + 短信发送
AbstractMessage urgentMessage2 = new UrgentMessage(messageSMS);
urgentMessage2.sendMessage("MarkLogZhu","test");
}
控制台输出:
邮件发送至:MarkLogZhu内容为:TEST
短信发送至:MarkLogZhu内容为:TEST
邮件发送至:MarkLogZhu内容为:紧急:TEST
短信发送至:MarkLogZhu内容为:紧急:TEST