桥接设计模式

news2024/9/21 12:39:17

一、桥接模式

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

在这里插入图片描述

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕业设计ssm社区养老服务管理系统iq0w7(附源码、数据库)

java计算机毕业设计ssm社区养老服务管理系统iq0w7(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

海口市美兰区图书馆建筑结构设计(计算书+任务书+建筑结构施工组织设计cad图纸)

【目录】 1目录……………………………………………………………………………………………………….1 2前言……………………………………………………………………………………………………3 3 摘要……………………………………………………………….…………………………1 结…

Java项目:SSM出租车管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 超级管理员角色包含以下功能: 超级管理员管理,公告管理,系统管理员管理,司机管理,车辆管理,维修保养管理,运营里程记录等功能。 普通…

12.4泛型 map set

目录 一,泛型 1 什么是泛型 2 引出泛型 2.1语法 3 泛型类的使用 3.1 语法 3.2 示例 3.3 类型推导(Type Inference) 4.裸类型(Raw Type) 5 泛型如何编译的 5.2 为什么不能实例化泛型类型数组 6 泛型的上界 6.1 语法 6.3 复杂示例 7 泛型方法 7.1 定义语法 二.通…

【数据结构】二分搜索树

集合java.util包下的常用子类,集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高校进行读写,无论哪种具体的集合无外乎CURD。 Collection->单个元素保存的父接口。 List->可以保存重复的单个元素。 Set->保存单个不重复元素。…

python在centos7.x下建立虚拟环境

(327条消息) python在centos下安装以及配置_雨师的博客-CSDN博客 https://blog.csdn.net/wtt234/article/details/128172281 python离线环境下安装第三方模块的方法: https://blog.csdn.net/wtt234/article/details/128162292 上篇已经把python在centos下的安装以及…

红蓝对抗--sliver 搭建

使用sliver的优点: 1 支持macos、win、linux上线 2 支持丰富的插件加载扩展,功能选择多,CS已经很普遍了,可以尝试sliver做C2 sliver相关构成: Implant:生成植入的木马 sliver-client :C2的控制端 Sliver Server:C2的控制端,客户端通过gRPC接口与server交互 架构: […

【 java 集合】Collection 接口中的常用方法

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

LeetCode刷题复盘笔记—一文搞懂纯完全背包问题(动态规划系列第十一篇)

今日主要总结一下动态规划背包问题的基础——纯完全背包问题 在Leetcode题库中主要都是0-1背包和完全背包的应用问题,所以主要掌握这两个背包问题 题目:纯完全背包问题 题目描述: 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是w…

List——顺序表与链表(二)

文章目录前言一、链表概念及结构二、LinkedList与链表1.什么是LinkedList2.LinkedList的常用方法3.链表的遍历三.实现自己的LinkedList四.ArrayList和LinkedList的区别与优缺点总结前言 上一篇文章中,介绍了List接口以及ArrayList的使用,并且进行了简单…

ByteTrack多目标追踪论文阅读

paper:ByteTrack: Multi-Object Tracking by Associating Every Detection Box code:ByteTrack 一.摘要 多目标追踪的目的是识别视频中物体或对象的位置和身份,也就是说,不同于目标检测的是,追踪问题可以分为两个任务:1&#x…

(附源码)springboot平衡膳食小程序 毕业设计 250859

基于springboot平衡膳食小程序 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,平衡膳食小程序被用户普遍使…

物联网设备WIFI模块实现

问题 如何在设备上进行 Wifi 编程? LwIp (Light Weight IP) 简介 LwIp 是轻量化的 TCP/IP,是一个小型开源的 TCP/IP 协议栈 LwIp 的设计目标是用较少的资源实现较完整的 TCP/IP 协议栈 LwIp 能在操作系统中运行,也能在无操作系统的情况下…

Java—异常体系

文章目录异常和错误java异常的分类:非运行时异常运行时异常受检异常(非运行时异常)如何处理?1、try catch finally为什么要用try catch finally2、throwsThrow和Throws的区别JVM是如何处理异常的try-catch-finally中哪个部分可以省…

项目管理逻辑:项目经理如何掌控项目生命周期, 才能避免身心俱疲?

目录 1.项目生命周期 2.预测型项目周期 3.迭代型项目周期 3.1.初始阶段 3.2.精化阶段 3.3.构建阶段 3.4.交付阶段 4.增量型生命周期 5.敏捷开发 5.根据具体项目使用合理的开发方式 1.项目生命周期 2.预测型项目周期 预测型项目周期就是软件开发领域的瀑布流模型&…

【Python自然语言处理】概率上下文无关文法(PCFG)及神经网络句法分析讲解(图文解释 超详细)

觉得有帮助或有疑问麻烦点赞关注收藏后评论区私信留言~~~ 一、句法分析 句法分析(syntactic parsing或者parsing)是识别句子包含的句法成分要素以及成分之间的内在关系,一般以句法树来表示句法分析的结果。实现该过程的应用称作句法分析器&a…

三维模型的简化算法研究(任务书+lunwen+外文翻译+源码+查重报告)

目 录 第1章 绪论 1 1.1 研究背景 1 1.2 内存网格简化算法 1 1.2.1 顶点聚类 1 1.2.2 区域合并 2 1.2.3 迭代式消除 4 1.2.4 随机重采样 5 1.3 三维模型简化算法 6 1.3.1 分片简化 6 1.3.2 使用外部数据结构 7 1.3.3 网格批处理 9 1.3.4 流式简化 10 1.3.5 小结 11 1.4 自适应等…

【前沿技术RPA】 一文了解UiPath Orchestrator的触发器和监听器

🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。 🐬个人主页:会敲键盘的肘子 🐰系列专栏:UiPath 🦀专栏简介:UiPath在传统的RPA(Robotic…

公众号接口免费调用

公众号接口免费调用 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转)…

Express:CORS 跨域资源共享

CORS 跨域资源共享 Staticfile CDN 1. 接口的跨域问题 刚才编写的 GET 和 POST接口,存在一个很严重的问题:不支持跨域请求。 解决接口跨域问题的方案主要有两种: 1.CORS(主流的解决方案,推荐使用) 2.J…