文章内容
一、什么是桥接模式
桥接模式,将抽象部分与它的实现部分分离开来,使他们都可以独立变化。将继承关系改为关联关系,减少耦合,即解耦。将变化的维度进行抽离,在他们之间搭建一座桥梁来通信。
桥接模式,属于结构型模式。
二、桥接模式类图

三、桥接模式角色
- 抽象类角色(Abstraction):用于定义抽象类的接口,并包含一个对实现化对象的引用。
- 扩充抽象类角色(RefinedAbstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现类接口角色(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现类角色(ConcreteImplementor):具体实现Implementor接口。
四、桥接模式使用场景
- 当一个类存储两个独立变化的维度,且这两个维度都要进行扩展时。
- 当因使用继承或多层次继承导致类数量急剧增加的需求时,可以考虑使用桥接模式。
五、桥接模式demo示例
1、Demo需求
实现发消息功能:可以发送邮件消息、短信消息、钉钉消息,同时可以对消息指定是否紧急,比如及时消息类型、延迟消息类型。
2、接口及抽象类定义
1 2 3 4 5 6 | /** * 实现类接口角色:发送消息接口 */ public interface IMessage { void sendMsg(); } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | /** * 抽象类角色:消息时效性(及时消息 、延迟消息) */ public abstract class IMessageType { protected IMessage message; public IMessageType(IMessage message){ this .message = message; } /** * 发送消息时效性 */ protected abstract void sendByType(); } |
3、实现类定义
1 2 3 4 5 6 7 8 | /** * 具体实现类角色:发邮件消息 */ public class EmailMessage implements IMessage { public void sendMsg() { System.out.println( "发送邮件消息..." ); } } |
1 2 3 4 5 6 7 8 | /** * 具体实现类角色: 发短信消息 */ public class SmsMessage implements IMessage { public void sendMsg() { System.out.println( "发送短信消息..." ); } } |
1 2 3 4 5 6 7 8 | /** * 具体实现类角色: 发送钉钉消息 */ public class DingdingMessage implements IMessage { public void sendMsg() { System.out.println( "发送钉钉消息..." ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 | /** * 扩充抽象类角色: 发送延迟消息 */ public class DelayMessageType extends IMessageType { public DelayMessageType(IMessage message) { super (message); } protected void sendByType() { message.sendMsg(); System.out.println( "发送了延迟消息..." ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 | /** * 扩充抽象类角色: 发送实时消息 */ public class TimelyMessageType extends IMessageType { public TimelyMessageType(IMessage message) { super (message); } protected void sendByType() { message.sendMsg(); System.out.println( "发送及时消息..." ); } } |
4、测试
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | /** * 桥接模式客户端测试 */ 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(); } } |
1 2 3 4 5 6 7 8 | 发送短信消息... 发送及时消息... ============================= 发送钉钉消息... 发送了延迟消息... ============================= 发送邮件消息... 发送了延迟消息... |