设计模式之桥接模式

一、什么是桥接模式

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

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

二、桥接模式类图

设计模式之桥接模式插图

三、桥接模式角色

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

发表评论