当前位置: 首页 > news >正文

桥接设计模式

一、桥接模式

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)消息-实现角色

public interface IMessage {
    void send(String message, String toUser);
}

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

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

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

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

(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);
    }
}

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

public class NomalMessage extends AbstractMessage {
	public NomalMessage(IMessage iMessage) {
		super(iMessage);
	}

	@Override
	public void sendMessage(String message, String toUser) {
		// 普通消息,直接调用父类发送即可
		super.sendMessage(message, toUser);
	}
}

(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
	}
}

(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("野王请求支援", "赵云");
	}

在这里插入图片描述

– 求知若饥,虚心若愚。

相关文章:

  • 2024年AI+游戏赛道的公司和工具归类总结
  • 河南大学24计算机考研数据,有三个学院招收计算机相关专业,都是考的408!
  • Ubuntu系统docker gpu环境搭建
  • EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式)
  • python开发自己的模块
  • 【C++】哈希的概念及STL中有关哈希容器的使用
  • 动态获取权限,文件管理器选择文件,I/O流
  • GO学习记录
  • spark基础
  • Spring Boot项目误将Integer类型写成int来进行传参
  • 如何准确获取PDF文件中的标题
  • 第十一届蓝桥杯省赛第一场C++ A/B组《解码》(c++)
  • [附源码]计算机毕业设计物品捎带系统Springboot程序
  • 100天精通Python(数据分析篇)——第67天:Pandas数据连接、合并、重构(pd.merge、pd.concat、stack、unstack)
  • 使用uni-app创建扫码连接wifi小程序
  • 【单片机基础】ADC0832详解
  • [附源码]计算机毕业设计基于springboot的文成考研培训管理系统
  • Java Script 内置对象(三) --------- Array 对象
  • 机器学习:详细推导高斯混合聚类(GMM)原理(附Python实现)
  • 华为机试 - 字符串匹配
  • 关于spark配置项 和 hive serDe 和 spark serDe
  • Linux | 二级页表的虚拟地址是怎么转换的?
  • .m3u8.sqlite文件转mp4,m3u8.sqlite文件转视频工具(开源免费)
  • 计算机毕业设计Java电商项目(源码+系统+mysql数据库+lw文档)
  • webpack使用入门贴
  • 【Linux内核】Linux内核介绍
  • linux关于ssh免密登录、known_hosts文件
  • mongoDB操作文档(全部)
  • 基于SSM的服装商城销售系统(含文档资料)
  • 【力扣·每日一题】1774. 最接近目标价格的甜点成本 (dfs搜索 动态规划 Go)
  • Activiti7工作流(二)
  • [附源码]计算机毕业设计大学生心理测评系统