• 桥接设计模式


    一、桥接模式

    1、定义

    桥接模式(Bridge Pattern)又称作桥梁模式,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。

    桥接模式的主要目的是通过组合的方式建立两个类之间的联系,而不是继承,但又类似多重继承方案。
    桥接 模式的核心在于把抽象与实现解耦。这里的抽象与实现指的是两种独立变化的维度。

    2、结构

    (1)模式的结构

    主要角色如下:

    • 抽象角色(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类。
    • 修正角色(RefinedAbstraction):Abstraction的具体实现,对 Abstraction的方法进行完善和扩展。
    • 实现角色(IImplementor):确定实现维度的基本操作,提供为 Abstraction使用。一般为接口或者抽象类。
    • 具体实现角色(ConcreteIImplementor):IImplementor的具体实现。

    3、优缺点

    优点:

    • 分离抽象部分及其具体实现部分。
    • 提高了系统的扩展性。
    • 符合开闭原则。
    • 符合合成复用原则。

    缺点:

    • 增加了系统的理解与设计难度。
    • 需要正确地是识别系统中两个独立变化的维度。

    4、使用场景

    • 在抽象和具体实现之间需要增加更多灵活性的场景。
    • 一个类存在两个或者多个独立变化的维度,而这两个或者多个维度都需要独立进行扩展。

    5、在框架源码中使用

    • JDBC API源码中的 Driver类就是桥接对象。

    二、模式的通用实现

    代码如下:

    public class BridgePattern {
    	public static void main(String[] args) {
    		ConcreteIImplementorA iImplementorA = new ConcreteIImplementorA();
    
    		// 组合/聚合实现
    		RefinedAbstraction abstraction = new RefinedAbstraction(iImplementorA);
    		abstraction.operation();
    	}
    }
    
    // 抽象角色
    abstract class Abstraction {
    	// 实现角色的引用
    	protected IImplementor iImplementor;
    
    	public Abstraction(IImplementor iImplementor) {
    		this.iImplementor = iImplementor;
    	}
    
    	public void operation(){
    		iImplementor.operationImpl();
    	}
    }
    
    // 修正角色
    class RefinedAbstraction extends Abstraction{
    
    	public RefinedAbstraction(IImplementor iImplementor) {
    		super(iImplementor);
    	}
    
    	@Override
    	public void operation() {
    		super.operation();
    		// do something
    		System.out.println("RefinedAbstraction do something");
    	}
    }
    
    // 实现角色
    interface IImplementor{
    	void operationImpl();
    }
    
    // 具体实现角色
    class  ConcreteIImplementorA implements IImplementor{
    	@Override
    	public void operationImpl() {
    		System.out.println("ConcreteIImplementorA----do");
    	}
    }
    
    class  ConcreteIImplementorB implements IImplementor{
    	@Override
    	public void operationImpl() {
    		System.out.println("ConcreteIImplementorB----do");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    在这里插入图片描述

    三、模式的应用实例

    (1)消息-实现角色

    public interface IMessage {
        void send(String message, String toUser);
    }
    
    • 1
    • 2
    • 3

    (2)邮件消息-具体实现角色

    public class EmailMessage implements IMessage {
    	@Override
    	public void send(String message, String toUser) {
    		System.out.println("使用邮件消息发送:" + message + " 给 " + toUser);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (3)短信消息-具体实现角色

    public class SMSMessage implements IMessage {
    	@Override
    	public void send(String message, String toUser) {
    		System.out.println("使用短信消息发送:" + message + " 给 " + toUser);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (4)桥接抽象角色

    public class AbstractMessage {
        protected IMessage iMessage;
    
        public AbstractMessage(IMessage iMessage) {
            this.iMessage = iMessage;
        }
    
        // 发送消息,委派给实现部分的方法
        public void sendMessage(String message, String toUser) {
            this.iMessage.send(message, toUser);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (5)具体普通消息-修正角色

    public class NomalMessage extends AbstractMessage {
    	public NomalMessage(IMessage iMessage) {
    		super(iMessage);
    	}
    
    	@Override
    	public void sendMessage(String message, String toUser) {
    		// 普通消息,直接调用父类发送即可
    		super.sendMessage(message, toUser);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (6)具体加急消息-修正角色

    public class UrgencyMessage extends AbstractMessage {
    	public UrgencyMessage(IMessage iMessage) {
    		super(iMessage);
    	}
    
    	@Override
    	public void sendMessage(String message, String toUser) {
    		message = "【加急】" + message;
    		super.sendMessage(message, toUser);
    		// do something
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (7)测试

    	public static void main(String[] args) {
    		IMessage emailMessage = new EmailMessage();
    		AbstractMessage nomalMessage = new NomalMessage(emailMessage);
    		nomalMessage.sendMessage("野王求让buff", "赵云");
    
    		IMessage smsMessage = new SMSMessage();
    		AbstractMessage urgencyMessage = new UrgencyMessage(emailMessage);
    		urgencyMessage.sendMessage("野王请求支援", "赵云");
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    – 求知若饥,虚心若愚。

  • 相关阅读:
    我开源了团队内部基于SpringBoot Web快速开发的API脚手架stater
    java 歌词解析 源代码, 在windows10下调试运行成功。
    Spring实现注解(编程式事务管理、通过XML或注解的声明式事务管理)
    网络安全(黑客)自学
    IDEA中maven jar下载失败问题处理
    代码随想录笔记_动态规划_392判断子序列
    【车载AI音视频电脑】高清车载摄像头,车载云台摄像头
    java计算机毕业设计新闻网站MyBatis+系统+LW文档+源码+调试部署
    EasyAR使用
    整理SpringBoot整合MyBatisPlus+Dubbo问题解决方法
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/128178860