文章内容
一、什么是桥接模式
桥接模式,将抽象部分与它的实现部分分离开来,使他们都可以独立变化。将继承关系改为关联关系,减少耦合,即解耦。将变化的维度进行抽离,在他们之间搭建一座桥梁来通信。
桥接模式,属于结构型模式。
二、桥接模式类图
三、桥接模式角色
- 抽象类角色(Abstraction):用于定义抽象类的接口,并包含一个对实现化对象的引用。
- 扩充抽象类角色(RefinedAbstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现类接口角色(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现类角色(ConcreteImplementor):具体实现Implementor接口。
四、桥接模式使用场景
- 当一个类存储两个独立变化的维度,且这两个维度都要进行扩展时。
- 当因使用继承或多层次继承导致类数量急剧增加的需求时,可以考虑使用桥接模式。
五、桥接模式demo示例
1、Demo需求
实现发消息功能:可以发送邮件消息、短信消息、钉钉消息,同时可以对消息指定是否紧急,比如及时消息类型、延迟消息类型。
2、接口及抽象类定义
/**
* 实现类接口角色:发送消息接口
*/ public interface IMessage {
void sendMsg();
}
/**
* 抽象类角色:消息时效性(及时消息 、延迟消息)
*/ public abstract class IMessageType {
protected IMessage message;
public IMessageType(IMessage message){
this.message = message;
}
/**
* 发送消息时效性
*/ protected abstract void sendByType();
}
3、实现类定义
/**
* 具体实现类角色:发邮件消息
*/ public class EmailMessage implements IMessage {
public void sendMsg() {
System.out.println("发送邮件消息...");
}
}
/**
* 具体实现类角色: 发短信消息
*/ public class SmsMessage implements IMessage {
public void sendMsg() {
System.out.println("发送短信消息...");
}
}
/**
* 具体实现类角色: 发送钉钉消息
*/ public class DingdingMessage implements IMessage {
public void sendMsg() {
System.out.println("发送钉钉消息...");
}
}
/**
* 扩充抽象类角色: 发送延迟消息
*/ public class DelayMessageType extends IMessageType {
public DelayMessageType(IMessage message) {
super(message);
}
protected void sendByType() {
message.sendMsg();
System.out.println("发送了延迟消息...");
}
}
/**
* 扩充抽象类角色: 发送实时消息
*/ public class TimelyMessageType extends IMessageType {
public TimelyMessageType(IMessage message) {
super(message);
}
protected void sendByType() {
message.sendMsg();
System.out.println("发送及时消息...");
}
}
4、测试
/**
* 桥接模式客户端测试
*/ public class Client {
public static void main(String[] args) {
// 1.发送及时的短信消息
IMessageType messageType = new TimelyMessageType(new SmsMessage());
messageType.sendByType();
System.out.println("=============================");
// 2.发送延迟的钉钉消息
messageType = new DelayMessageType(new DingdingMessage());
messageType.sendByType();
// 3.发送延迟的邮件消息
System.out.println("=============================");
messageType = new DelayMessageType(new EmailMessage());
messageType.sendByType();
}
}
发送短信消息...
发送及时消息...
=============================
发送钉钉消息...
发送了延迟消息...
=============================
发送邮件消息...
发送了延迟消息...