Java基础:桥接模式

桥接模式(Bridge Pattern)主要用于将抽象部分与其实现部分分离,使它们可以独立变化。这种模式通过创建一个抽象类和实现了该抽象类的具体类之间的桥梁来实现这一目的,从而让抽象类和它的实现可以以组合的方式耦合,而不是通过继承。这样设计的好处是可以让系统在不修改抽象和实现的情况下,独立地扩展抽象层次和实现层次。

原理

桥接模式的核心在于“脱耦”,它包含两个重要的角色:

  1. Abstraction(抽象类):定义抽象接口,并持有Implementor(实现类)的对象引用。
  2. Implementor(实现类接口):定义实现类的接口,但不提供具体实现。
  3. ConcreteImplementor(具体实现类):实现Implementor接口,提供具体功能的实现。

通过这样的结构,抽象类的变化不会影响到实现类,反之亦然,两者可以独立演化。

优点

  1. 分离抽象与实现:使得抽象和实现可以独立进行变化,提高了系统的可扩展性。
  2. 优秀的扩展性:新增实现类或抽象类都非常容易,符合开闭原则。
  3. 提高可维护性:各部分职责清晰,便于维护和理解。

适用场景

  1. API网关的适配器模式:API网关需要对接不同的后端服务,每种服务可能有不同的通信协议或数据格式,可以通过桥接模式设计适配器,使得API网关对新增服务的支持更加灵活。
  2. 日志记录系统:不同微服务可能需要将日志记录到不同的存储介质(如数据库、文件系统、ELK Stack等),桥接模式可以用来设计日志记录组件,使其支持多种存储方式。
  3. 配置管理:在多环境(开发、测试、生产)中,配置获取的方式可能不同(本地文件、远程服务器等),使用桥接模式可以灵活应对不同环境下的配置获取策略。

代码示例

下面是一个简单的桥接模式示例,模拟图形绘制系统中的颜色和形状分离:

// 实现类接口
interface DrawAPI {void drawCircle(int radius, int x, int y);
}// 具体实现类
class RedCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: red, radius: " + radius + ", x: " + x + ", y: " + y + "]");}
}class GreenCircle implements DrawAPI {@Overridepublic void drawCircle(int radius, int x, int y) {System.out.println("Drawing Circle[ color: green, radius: " + radius + ", x: " + x + ", y: " + y + "]");}
}// 抽象类
abstract class Shape {protected DrawAPI drawAPI;protected int x, y, radius;public Shape(DrawAPI drawAPI) {this.drawAPI = drawAPI;}abstract void draw();
}// 具体抽象类
class Circle extends Shape {public Circle(DrawAPI drawAPI, int x, int y, int radius) {super(drawAPI);this.x = x; this.y = y; this.radius = radius;}@Overridepublic void draw() {drawAPI.drawCircle(radius, x, y);}
}public class BridgePatternDemo {public static void main(String[] args) {Shape redCircle = new Circle(new RedCircle(), 100, 100, 10);Shape greenCircle = new Circle(new GreenCircle(), 150, 150, 10);redCircle.draw();greenCircle.draw();}
}

存在的问题

  1. 过度设计:对于一些简单的情况,直接使用继承可能更直观且易于理解,引入桥接模式可能会增加系统的复杂度。
  2. 理解和使用成本:桥接模式的概念和实现相对复杂,对于团队成员来说,理解和正确应用该模式可能需要更多的时间和经验。
  3. 类膨胀:由于桥接模式涉及到多个接口和类,可能会导致类的数量增多,增加了系统的复杂度。

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

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

相关文章

【webrtc】rtp扩展:绝对发送时间、绝对采集时间、时间戳插值

WebRTC RTP 标头扩展审查绝对发送时间和绝对采集时间,二者是不同的当没有打开绝对采集时间戳的扩展时,webrtc依旧会使用AbsoluteCaptureTimeInterpolator 在接收测估算 绝对采集时间戳。Absolute Send Time 带宽估计算法用 The Absolute Send Time extension is used to stam…

LeetCode/NowCoder-链表经典算法OJ练习4

人的才华就如海绵的水,没有外力的挤压,它是绝对流不出来的。流出来后,海绵才能吸收新的源泉。💓💓💓 目录 说在前面 题目一:环形链表 题目二:环形链表 II 题目三:随机…

《Python编程从入门到实践》day34

# 昨日知识点回顾 json文件提取数据、绘制图表渐变色显示 # 今日知识点学习 第17章 17.1 使用Web API Web API作为网站的一部分,用于与使用具体URL请求特定信息的程序交互,这种请求称为API调用。 17.1.1 Git 和 GitHub Git:分布式版本控制系…

vue-封装上下(垂直方向)轮播

需求&#xff1a;没有找到特别好的上下轮播插件-所以自己写了一个简单的demo 一.上下平滑轮播-移入停止-移出继续轮播 <!--* 消息滚动 --> <template><div class"news"><div id"roll" class"InfoBox" mouseover"thi…

Media Encoder 2024 for Mac媒体编码器安装教程ME2024安装包下载

安装 步骤 1&#xff0c;双击打开下载好的安装包。 2&#xff0c;选择install ame_24...双击打开启动安装程序。 3&#xff0c;点击install。 4&#xff0c;输入电脑密码。 5&#xff0c;软件安装中... 6&#xff0c;安装结束点击好。 7&#xff0c;返回打开的镜像 选择激活补…

零基础,想做一名网络安全工程师,该怎么学习?

​ 相比IT类的其它岗位&#xff0c;网络工程师的学习方向是比较明亮的。想要成为网络工程师&#xff0c;华为认证就是最好的学习方法。而网络工程师的从零开始学习就是从华为认证的初级开始学起&#xff0c;也就是HCIA&#xff0c;也就是从最基本的什么是IP地址、什么是交换机这…

响应式流和reactor框架进阶

响应式流和reactor框架进阶 响应式流创建、转换、处理 本文档主要介绍在响应式编程中如何从流中获取数据并处理。 前提条件 假设您已经能掌握Java基础、Maven使用、Lamda表达式、响应式编程等基础。 如何获取流中数据 &#x1f30f; 说明 1、不要试图从流中获取数据出来&a…

第⼀次页⾯加载会触发哪⼏个钩⼦?DOM 渲染在哪个周期中就已经完成?

在Vue中&#xff0c;第一次页面加载会触发以下钩子函数&#xff1a; beforeCreate&#xff1a;在实例初始化之后&#xff0c;数据观测(data observer) 和 event/watcher 事件配置之前被调用。 created&#xff1a;在实例创建完成后被立即调用。在这一步&#xff0c;实例已完成…

Angular(1):使用Angular CLI创建空项目

要创建一个空的 Angular 项目&#xff0c;可以使用 Angular CLI&#xff08;命令行界面&#xff09;。以下是使用 Angular CLI 创建一个新项目的步骤&#xff1a; 1、安装 Angular CLI&#xff1a; 打开你的命令行界面&#xff08;在 Windows 上是 CMD、PowerShell 或 Git Bas…

使用python绘制一个五颜六色的爱心

使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心&#xff01; 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…

【Python设计模式07】工厂方法模式

工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它定义了一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。通过使用工厂方法模式&#xff0c;可以将对象的创建过程与使用…

微软:最新ChatGPT-4o模型,可在 Azure OpenAI上使用

北京时间5月14日凌晨&#xff0c;OpenAI 一场不到 30 分钟的发布会&#xff0c;正式发布了 GPT-4o&#xff0c;视频语音交互丝滑到吓人&#xff0c;还即将免费可用&#xff01; GPT-4o&#xff0c;其中的「o」代表「omni」&#xff08;即全面、全能的意思&#xff09;&#xff…

如何通过locust进行全链路压测

通过Locust进行全链路压测的具体步骤 Locust是一个开源的性能测试工具&#xff0c;支持分布式压测和高并发测试。它基于Python编写&#xff0c;使用方便且功能强大。本文将详细介绍如何使用Locust进行全链路压测&#xff0c;包括准备工作、测试脚本编写、压测执行和结果分析等…

BIO从提交到执行完毕过程分析

1.上层调用submit_bio()向块设备层提交IO请求,q->make_request_fn()=>__make_request()被调用,将BIO合并到已有的request或为BIO新分配一个request. 2.调用elv_merge(),首先尝试是否可以和上一次合并的request进行合并,如果不能合并,调用IO调度器提供的合并函数,尝试与I…

AIGC行业:巨头引领的创新浪潮与市场前景

AIGC&#xff08;AI Generated Content&#xff09;技术&#xff0c;作为新兴的技术力量&#xff0c;正逐渐改变内容创作的生态。在这一变革中&#xff0c;国内科技巨头如百度、阿里巴巴、腾讯等的积极参与&#xff0c;不仅为行业带来资本和技术支持&#xff0c;更预示着AIGC技…

react 下拉框内容回显

需要实现效果如下 目前效果如下 思路 : 将下拉框选项的value和label一起存储到state中 , 初始化表单数据时 , 将faqType对应的label查找出来并设置到Form.Item中 , 最后修改useEffect 旧代码 //可以拿到faqType为0 但是却没有回显出下拉框的内容 我需要faqType为0 回显出下拉…

Shell脚本基本命令

文件名后缀.sh 编写shell脚本一定要说明一下在#&#xff01;/bin/bash在进行编写。命令选项空格隔开。Shell脚本是解释的语言&#xff0c;bash 文件名即可打印出编写的脚本。chmod给权限命令。如 chmod 0777 文件名意思是给最高权限。 注意:count赋值不能加空格。取消变量可在变…

如何提升网络性能监控和流量回溯分析的效率?

目录 什么是网络性能监控&#xff1f; 网络性能监控的关键指标 什么是流量回溯分析&#xff1f; 流量回溯分析的应用场景 网络性能监控与流量回溯分析的结合 实例应用&#xff1a;AnaTraf网络流量分析仪 如何选择适合的网络性能监控和流量回溯分析工具&#xff1f; 结论…

MQTT 5.0 报文解析 06:AUTH

欢迎阅读 MQTT 5.0 报文系列 的最后一篇文章。在上一篇中&#xff0c;我们已经介绍了 MQTT 5.0 的 DISCONNECT 报文。现在&#xff0c;我们将介绍 MQTT 中的最后一个控制报文&#xff1a;AUTH。 MQTT 5.0 引入了增强认证特性&#xff0c;它使 MQTT 除了简单密码认证和 Token 认…

Vue3实战笔记(36)—粒子特效完成炫酷的404

文章目录 前言404特效总结 前言 昨天介绍了一个粒子特效小例子&#xff0c;不够直观&#xff0c;下面直接实战在自己的项目中实现一个好玩滴。 404特效 更改之前创建好的404.vue: <template><div class"container"><vue-particles id"tspartic…