SpringBoot中的桥接模式
桥接模式是一种结构型设计模式,它的主要目的是通过将抽象部分与实现部分分离,提高系统的灵活性和可扩展性。在桥接模式中,有四个主要参与者:抽象类、具体抽象类、桥接类和具体类。
抽象类是定义了抽象方法的基类,这些抽象方法由子类实现。具体抽象类是抽象类的子类,实现了抽象类中定义的所有抽象方法。桥接类实现了抽象类,同时也持有对一个具体类的引用。具体类是实现了桥接类中的方法的具体类。
以下是桥接模式的代码示例:
抽象类 AbstractClass.java
public abstract class AbstractClass {public abstract void operation();
}
具体抽象类 ConcreteAbstractClass.java
public class ConcreteAbstractClass extends AbstractClass {@Overridepublic void operation() {System.out.println("Abstract method implementation in ConcreteAbstractClass");}
}
桥接类 BridgeClass.java
public class BridgeClass extends AbstractClass {private ConcreteClass concreteClass;public BridgeClass(ConcreteClass concreteClass) {this.concreteClass = concreteClass;}@Overridepublic void operation() {concreteClass.specificOperation();}
}
具体类 ConcreteClass.java
public class ConcreteClass {public void specificOperation() {System.out.println("Concrete method implementation in ConcreteClass");}
}
客户端代码 Client.java
public class Client {public static void main(String[] args) {ConcreteClass concreteClass = new ConcreteClass();BridgeClass bridgeClass = new BridgeClass(concreteClass);bridgeClass.operation(); // Output: Concrete method implementation in ConcreteClass}
}
在桥接模式中,抽象类和具体类的关系是不相关的,它们之间的耦合度很低。因此,我们可以轻松地扩展系统,只需要在桥接类中添加新的具体类即可。这种设计方式使得系统更加灵活和可扩展。在实际开发中,我们可以根据需要灵活地应用桥接模式来满足系统的需求。
Spring Boot中使用桥接模式提供对不同类型应用服务的原理
在软件工程中,桥接模式是一种结构型设计模式,它允许将一个类的接口与另一个类的接口连接起来,以实现两个不兼容的接口之间的通信。在Spring Boot中,桥接模式被广泛使用,以便提供对不同类型的应用服务的支持。本文将通过代码示例,详细介绍Spring Boot中使用桥接模式提供对不同类型应用服务的原理。
一、定义服务接口
首先,Spring Boot定义了一组服务接口,这些接口代表了应用可能需要的不同类型的应用服务。例如,可以定义一个名为ApplicationService的接口,该接口表示应用可能需要的各种服务操作,如用户管理、订单处理等。
public interface ApplicationService {void performService();
}
二、提供实现类
然后,Spring Boot为每个服务类型提供一个或多个实现类,这些实现类实现了相应的服务接口。例如,可以提供一个名为JpaApplicationService的实现类,该实现类使用JPA持久化数据并实现了ApplicationService接口。
@Repository
public class JpaApplicationService implements ApplicationService {@Autowiredprivate UserRepository userRepository;@Overridepublic void performService() {List<User> users = userRepository.findAll();// do something with the users}
}
三、注册服务提供者
在Spring Boot中,每个服务类型都有一个相应的服务提供者。服务提供者是一个实现了ApplicationService接口的类,它负责将具体的服务实现与Spring Boot的应用上下文连接起来。例如,可以注册一个名为JpaApplicationServiceProvider的服务提供者,该提供者将JpaApplicationService实现类与Spring Boot的应用上下文连接起来。
@Component
public class JpaApplicationServiceProvider implements ApplicationServiceProvider {@Autowiredprivate JpaApplicationService jpaApplicationService;@Overridepublic ApplicationService getService() {return jpaApplicationService;}
}
四、配置服务提供者
在Spring Boot的配置文件中,可以指定要使用的服务类型以及相应的服务提供者。例如,可以使用spring.application.services.jpaservice.enabled=true配置项来启用JPA服务的支持。
@Configuration
public class AppConfig {@Beanpublic ApplicationServiceProvider jpaApplicationServiceProvider() {return new JpaApplicationServiceProvider();}
}
五、使用服务
最后,在应用中可以通过依赖注入的方式使用服务。例如,可以在控制器类中注入一个ApplicationService类型的属性,并在方法中使用该属性来调用服务操作。
@RestController
public class MyController {@Autowiredprivate ApplicationService applicationService;applicationService; // inject the service to your controller or service. public String myEndpoint() {return applicationService.performService().toString();}
}
六、总结 通过以上示例代码,我们可以看到Spring Boot中使用桥接模式提供对不同类型应用服务的原理。它将服务接口与具体实现解耦,并通过注册服务提供者将它们连接起来。通过配置文件可以选择使用哪种服务类型,并通过依赖注入的方式在应用中使用服务。这种设计方式使得Spring Boot具有很高的灵活性和扩展性,可以根据不同的需求灵活地添加对不同类型应用服务的支持。
相关文章:
SpringBoot中的桥接模式
桥接模式是一种结构型设计模式,它的主要目的是通过将抽象部分与实现部分分离,提高系统的灵活性和可扩展性。在桥接模式中,有四个主要参与者:抽象类、具体抽象类、桥接类和具体类。 抽象类是定义了抽象方法的基类,这些…...
AI爆文变现脚本:易用且免费的自动写作脚本更新了
之前给大家分享的AI爆文变现写作脚本 由于时间仓促,加上我对很多东西不熟悉 免费版本对新手小白来说,安装部署起来是非常的困难 于是这几天我加班加点把整个软件的部署简化 现在无需复杂的环境配置安装,下载配置下就可以使用了。 免费版…...
代码随想录算法训练营Day 49 || 123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV
123.买卖股票的最佳时机III 力扣题目链接(opens new window) 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须…...
threejs(11)-精通着色器编程(难点)2
一、shader着色器编写高级图案 小日本国旗 precision lowp float; varying vec2 vUv; float strength step(0.5,distance(vUv,vec2(0.5))0.25) ; gl_FragColor vec4(strength,strength,strength,strength);绘制圆 precision lowp float; varying vec2 vUv; float strength 1…...
配置cuda和cudnn出现 libcudnn.so.8 is not a symbolic link问题
cuda版本为11.2 问题如图所示: 解决办法: sudo ln -sf /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.1.1 /usr/local/cuda-11.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8 sudo ln -sf /usr/local/cuda-11.2/targ…...
“目标值排列匹配“和“背包组合问题“的区别和leetcode例题详解
1 目标值排列匹配 1.1 从目标字符串的角度来看,LC139是一个排列问题,因为最终目标子串的各个字符的顺序是固定的? 当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题,确实可以认为它涉及到排列的概念,但这种…...
火星加载WMTS服务
这是正常的加载瓦片 http://192.168.1.23:8008/geoserver/mars3d/gwc/service/wmts?tilematrixEPSG%3A4326%3A7&layermars3d%3Abuffer&style&tilerow46&tilecol197&tilematrixsetEPSG%3A4326&formatimage%2Fpng&serviceWMTS&version1.0.0&…...
为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学
目录 引言 可能有人想问为什么要学习云服务器? (获取Linux环境,获得外网IP) 二、安装教程 引言 可能有人想问为什么要学习云服务器? (获取Linux环境,获得外网IP) 1.虚拟机(下策) …...
VS c++多文件编译
前言:记录下我这个菜鸡学习的过程,如有错误恳请指出,不胜感激! 1.简单多文件编译调试 文件目录: 编译: -g选项是告诉编译器生成调试信息,这样可以在程序崩溃或出现错误时更容易地进行调试。这…...
JVM关键指标监控(调优)
JVM 99%情况下不需要调优 使用性能更好的垃圾回收器 核心指标 针对单台服务器而言: jvm.gc.time: 每分钟GC耗时在1s以内 500ms以内最佳 jvm.gc.meantime: 每次YGC耗时在100ms以内,50ms以内最佳 jvm.fullgc.count: FGC(老生代垃圾回收)最多几小时1次&…...
【Proteus仿真】【Arduino单片机】LCD1602-IIC液晶显示
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶等。 主要功能: 系统运行后,LCD1602液晶显示各种效果。 二、软件设计 /* 作者:嗨小…...
skynet学习笔记03— 服务
01、API newservice(name, ...): 阻塞的形势启动一个名为 name 的新服务,待start函数执行完后会返回这个服务的地址。uniqueservice(name, ...):针对于当前节点,启动一个唯一服务(相当于单例),…...
34 Feign最佳实践
2.4.2.抽取方式 将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。 例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包…...
软文推广中如何搭建媒体矩阵
媒体矩阵简单理解就是在不同的媒体平台上,根据运营目标和需求,建立起全面系统的媒体布局,进行多平台同步运营。接下来媒介盒子就来和大家聊聊,企业在软文推广过程中为什么需要搭建媒体矩阵,又该如何搭建媒体矩阵。 一、…...
Unity地面交互效果——5、角色足迹的制作
大家好,我是阿赵。 之前几篇文章,已经介绍了地面交互的轨迹做法。包括了法线、曲面细分还有顶点偏移。Shader方面的内容已经说完了,不过之前都是用一个球来模拟轨迹,这次来介绍一下,怎样和角色动作结合,…...
Centos8安装出错问题
科普介绍: CentOS 8 是一个基于 Linux 的操作系统,是 Red Hat Enterprise Linux (RHEL)的免费和开源版本。它提供了稳定、安全和可靠的基础设施,适用于服务器和桌面环境。CentOS 8 是 CentOS 系列中最新的版本&#x…...
计算机网络技术
深入浅出计算机网络 微课视频_哔哩哔哩_bilibili 第一章概述 1.1 信息时代的计算机网络 1. 计算机网络各类应用 2. 计算机网络带来的负面问题 3. 我国互联网发展情况 1.2 因特网概述 1. 网络、互连网(互联网)与因特网的区别与关系 如图所示࿰…...
当电脑桌面黑屏,而你只有一个鼠标该怎么办(重启方法的平替)
作为一个打工人 电脑是不是黑屏简直是routine了 我们都知道重启能解决一切问题 但是!! 如果你只有一个鼠标 电脑因为种种原因没法重启 该怎么办呢? 别慌 下面的方法非常灵验 1.按住ctrlShiftEsc 调出任务管理器;此项为必须…...
Leetcode2833. 距离原点最远的点
Every day a Leetcode 题目来源:2833. 距离原点最远的点 解法1:贪心 要使得到达的距离原点最远的点,就看 left 和 right 谁大,将 left 和 right 作为矢量相加,再往同方向加上 underline。 答案即为 abs(left - rig…...
chrome 的vue3的开发者devtool不起作用
问题: 刚刚vue2升级到vue3,旧的devtool识别不了vue3数据。 原因: devtool版本过低。升级到最新。 解决: 去github下载vuetool项目代码: GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
