设计模式之桥接模式

一、什么是桥接模式

桥接模式,将抽象部分与它的实现部分分离开来,使他们都可以独立变化。将继承关系改为关联关系,减少耦合,即解耦。将变化的维度进行抽离,在他们之间搭建一座桥梁来通信。

桥接模式,属于结构型模式。

二、桥接模式类图

设计模式之桥接模式插图

三、桥接模式角色

  • 抽象类角色(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
发送短信消息...
发送及时消息...
=============================
发送钉钉消息...
发送了延迟消息...
=============================
发送邮件消息...
发送了延迟消息...

发表评论

欢迎阅读『设计模式之桥接模式|Java、设计模式|Nick Tan-梓潼Blog』