Java桥接模式源码剖析及使用场景

目录

  • 一、介绍
  • 二、项目管理系统中使用桥接模式
  • 三、权限管理中使用桥接模式
  • 四、Java JDBC中使用桥接模式

一、介绍

它的主要目的是将抽象化与实现化分离,使得二者可以独立变化,就像一个桥,将两个变化维度连接起来。各个维度都可以独立的变化。故称之为:桥接模式

桥接模式的核心在于通过一个桥接接口,将抽象部分与实现部分解耦。这样做的好处是显而易见的,当系统中的某个维度(抽象或实现)需要变更时,不会影响到另一个维度。具体来说,桥接模式涉及以下几个关键角色:

  1. 抽象化角色(Abstraction):它是抽象类的接口,定义了一个实现化的引用和对实现化的操作。

  2. 修正抽象化角色(Refined Abstraction):它是扩展了抽象化角色的子类,在实际应用中,具体的业务逻辑通常在这个角色中实现。

  3. 实现化角色(Implementor):这个角色定义了一个接口,由具体实现化角色来实现。

  4. 具体实现化角色(Concrete Implementor):这个角色实现了实现化接口的具体类。

二、项目管理系统中使用桥接模式

需求:项目管理系统,包含多种任务(编码任务,测试任务)和多种任务执行(本地执行,远程执行)方式 。还有开发和测试角色。我们可以使用桥接模式来分离任务和任务执行方式的实现,以便它们可以独立变化。

  • 定义项目管理系统中的任务接口
public interface Task {void performTask();
}
  • 具体的任务实现类
// 编码任务
public class CodingTask implements Task {@Overridepublic void performTask() {System.out.println("Performing coding task");}
}// 测试任务
public class TestingTask implements Task {@Overridepublic void performTask() {System.out.println("Performing testing task");}
}
  • 任务执行方式接口
public interface TaskExecution {void executeTask();
}
  • 具体的任务执行方式实现类
// 本地执行任务
public class LocalTaskExecution implements TaskExecution {@Overridepublic void executeTask() {System.out.println("Executing task locally");}
}// 远程执行任务
public class RemoteTaskExecution implements TaskExecution {@Overridepublic void executeTask() {System.out.println("Executing task remotely");}
  • 项目管理系统角色抽象类
public abstract class ProjectRole {protected Task task;protected TaskExecution taskExecution;public void setTask(Task task) {this.task = task;}public void setTaskExecution(TaskExecution taskExecution) {this.taskExecution = taskExecution;}public abstract void performProjectTask();
}
  • 项目管理系统具体角色实现类
// 开发人员角色
public class Developer extends ProjectRole {@Overridepublic void performProjectTask() {System.out.print("Developer role: ");task.performTask();System.out.print("Using ");taskExecution.executeTask();}
}// 测试人员角色
public class Tester extends ProjectRole {@Overridepublic void performProjectTask() {System.out.print("Tester role: ");task.performTask();System.out.print("Using ");taskExecution.executeTask();}
}
  • 客户端代码演示桥接模式的使用
public class BridgePatternDemo {public static void main(String[] args) {Task codingTask = new CodingTask();Task testingTask = new TestingTask();TaskExecution localTaskExecution = new LocalTaskExecution();TaskExecution remoteTaskExecution = new RemoteTaskExecution();// 创建不同角色的实例ProjectRole developer = new Developer();ProjectRole tester = new Tester();// 设置不同的任务和任务执行方式developer.setTask(codingTask);developer.setTaskExecution(remoteTaskExecution);tester.setTask(testingTask);tester.setTaskExecution(localTaskExecution);// 视图数据developer.performProjectTask();  // Output: "Developer role: Performing coding task Using Executing task remotely"tester.performProjectTask();   // Output: "Tester role: Performing testing task Using Executing task locally"}
}

大家说上面七步是桥接模式吗?在实际项目中,我们可以根据需要添加更多的任务和任务执行方式,而不需要修改已有的代码。核心在于正确识别并分离出两个独立的维度,并且这两个维度应该能够各自独立地变化和扩展。

三、权限管理中使用桥接模式

需求:权限管理系统,分别有普通角色、管理员角色、超级管理员角色。以数据权限设计,普通角色只能看到自己操作的数据,管理员角色可以看到普通角色操作的数据,超级管理员角色可以看到所有角色的数据。

  • 定义数据权限控制策略接口
public interface DataPermissionControlStrategy {void process();
}
  • 定义具体的数据权限控制策略实现类
// 普通角色只能看到自己操作的数据
public class NormalDataPermissionControlStrategy implements DataPermissionControlStrategy {@Overridepublic void process() {System.out.println("Normal role can only access own data");}
}// 管理员角色可以看到普通角色操作的数据
public class AdminDataPermissionControlStrategy implements DataPermissionControlStrategy {@Overridepublic void process() {System.out.println("Admin role can access normal role's data");}
}// 超级管理员角色可以看到所有角色的数据
public class SuperAdminDataPermissionControlStrategy implements DataPermissionControlStrategy {@Overridepublic void process() {System.out.println("Super admin role can access all data");}
}
  • 定义用户角色抽象类
public abstract class UserRole {protected DataPermissionControlStrategy dataPermissionControlStrategy;public void setDataPermissionControlStrategy(DataPermissionControlStrategy dataPermissionControlStrategy) {this.dataPermissionControlStrategy = dataPermissionControlStrategy;}public abstract void viewData();
}
  • 定义具体的用户角色实现类
// 普通角色
public class NormalRole extends UserRole {@Overridepublic void viewData() {System.out.print("Normal role: ");dataPermissionControlStrategy.process();}
}// 管理员角色
public class AdminRole extends UserRole {@Overridepublic void viewData() {System.out.print("Admin role: ");dataPermissionControlStrategy.process();}
}// 超级管理员角色
public class SuperAdminRole extends UserRole {@Overridepublic void viewData() {System.out.print("Super admin role: ");dataPermissionControlStrategy.process();}
}
  • 客户端代码演示桥接模式的使用
// 客户端代码演示桥接模式的使用
public class BridgePatternDemo {public static void main(String[] args) {DataPermissionControlStrategy normalStrategy = new NormalDataPermissionControlStrategy();DataPermissionControlStrategy adminStrategy = new AdminDataPermissionControlStrategy();DataPermissionControlStrategy superAdminStrategy = new SuperAdminDataPermissionControlStrategy();// 创建不同角色的实例UserRole normalUser = new NormalRole();UserRole adminUser = new AdminRole();UserRole superAdminUser = new SuperAdminRole();// 设置不同的数据权限控制策略normalUser.setDataPermissionControlStrategy(normalStrategy);adminUser.setDataPermissionControlStrategy(adminStrategy);superAdminUser.setDataPermissionControlStrategy(superAdminStrategy);// 视图数据normalUser.viewData();  // Output: "Normal role: Normal role can only access own data"adminUser.viewData();   // Output: "Admin role: Admin role can access normal role's data"superAdminUser.viewData();  // Output: "Super admin role: Super admin role can access all data"}
}

四、Java JDBC中使用桥接模式

在Java JDBC中,桥接模式并不是直接使用的设计模式。然而,在JDBC中,可以看到一些类似于桥接模式的结构和思想。

1.DataSource 接口:在JDBC中,DataSource 是一个接口,它提供了获取数据库连接的方法。不同的数据库厂商(比如MySQL、Oracle等)都会有对应的DataSource 实现类。这种设计类似于桥接模式中的抽象部分。

2.Connection 接口和实现类:Connection 接口代表着一个数据库连接,而具体的数据库连接操作是由各个数据库厂商提供的实现类来完成的,比如MySQLConnection、OracleConnection 等。这也体现了桥接模式中的实现部分。

通过接口和实现类的结合,实现了对不同数据库的访问和操作,并且很好地解耦了抽象和实现部分。

// 1.定义厂商DataSource 接口
public interface DataSource {Connection getConnection();
}// 2.MySQLDataSource 实现类
public class MySQLDataSource implements DataSource {@Overridepublic Connection getConnection() {// 返回 MySQL 数据库连接return new MySQLConnection();}
}// 3.OracleDataSource 实现类
public class OracleDataSource implements DataSource {@Overridepublic Connection getConnection() {// 返回 Oracle 数据库连接return new OracleConnection();}
}// 4.不同的数据库不同的连接方法Connection 接口
public interface Connection {void executeQuery(String query);
}// 5.MySQLConnection 实现类
public class MySQLConnection implements Connection {@Overridepublic void executeQuery(String query) {// 在 MySQL 数据库中执行查询System.out.println("Executing query in MySQL database: " + query);}
}// 6.OracleConnection 实现类
public class OracleConnection implements Connection {@Overridepublic void executeQuery(String query) {// 在 Oracle 数据库中执行查询System.out.println("Executing query in Oracle database: " + query);}
}

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

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

相关文章

python数据分析numpy基础之sort对数组排序

1 python数据分析numpy基础之sort对数组排序 numpy数组和python的内置列表类似,也可以进行排序,numpy.sort()返回排序后的数组副本,而ndarray.sort()对数组进行就地排序,会改变原数组。 用法 numpy.sort(a, axis-1, kindNone, …

解决cryptography库报错【DLL load failed while importing _rust】

解决 DLL load failed while importing _rust python使用库cryptography问题分析解决办法 python使用库cryptography 当 from cryptography.hazmat.bindings._rust import exceptions as rust_exceptions 时,会报错: ImportError: DLL load failed whi…

机器学习--循环神经网络(RNN)3

本篇文章结合具体的例子来介绍一下LSTM运算方式以及原理。请结合上篇文章的介绍食用。 一、具体例子 如上图所示,网络里面只有一个 LSTM 的单元,输入都是三维的向量,输出都是一维的输出。 这三维的向量跟输出还有记忆元的关系是这样的。 假设…

深度学习:如何面对隐私和安全方面的挑战

深度学习技术的广泛应用推动了人工智能的快速发展,但同时也引发了关于隐私和安全的深层次担忧。如何在保护用户隐私的同时实现高效的模型训练和推理,是深度学习领域亟待解决的问题。差分隐私、联邦学习等技术的出现,为这一挑战提供了可能的解…

备战蓝桥之搜索

2024.3.12 P2802 回家 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) import java.awt.Checkbox; import java.awt.PageAttributes.OriginType; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrite…

k8s-生产级的k8s高可用(2) 25

部署containerd k8s2、k8s3、k8s4在配置前需要重置节点(reset)在上一章已完成 禁用所有节点docker和cri-docker服务 所有节点清除iptables规则 重置后全部节点重启 由于之前部署过docker,因此containerd默认已安装 修改配置 启动containe…

python学习、开发实用文档分享

今天给大家分享两个好用的关于python django框架使用的在线文档 Django中文在线文档: Django 文档 | Django 文档 | Django django rest framework 文档 1 - Serialization - Django REST framework中文站点 有开发和学习中遇到不会的, 或者需要学习的技能点直接去上面两个…

嵌入式工资为啥比纯软工资低那么多?

嵌入式工资为啥比纯软工资低那么多? 在开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,给了我机会,一年时间从3k薪资涨到18k的, 我师父给了一些 电气工程师学习方法和资料,让我不断提升自己&…

并发支持库(3)-互斥

互斥可以对操作集合上锁,避免多个线程同时访问共享资源。这些操作集合可以看作是一次原子操作。 本文章的代码库: https://gitee.com/gamestorm577/CppStd 1. 互斥类 c提供了各种互斥类。 mutex 构造函数 默认构造函数构造一个处于未锁定状态的互…

短路逻辑运算--c语言

#include<stdio.h>int main() { int i1; i,i||i; printf("%d",i);//3return 0; } 再逻辑运算的原则一定优先于其他逻辑判断&#xff0c;再这个式子中||前面的结果已经为真存在逻辑短路的情况所以不用管后面的式子。 i&#xff0c;i自增两次i3&#xff0c;

爬虫技术之正则提取静态页面数据

第一天 简单示例 在爬虫过程中&#xff0c;我们获取到了页面之后&#xff0c;通常需要做的就是解析数据&#xff0c;将数据持久化到数据库为我所用。如何又快又准确得提取有效数据&#xff1f;这是一门技术&#xff0c;看了我的博客之前可能略有难度&#xff0c;但各位大师看…

redis源码分析

是什么 是基于内存(而不是磁盘)的kv(而不是关系型mysql那种)数据库&#xff0c;通过空间换时间 源码分析 跳表skiplist 假设你有个有序链表&#xff0c;你想看某个特定的值是否出现在这个链表中&#xff0c;那你是不是只能遍历一次链表才能知道&#xff0c;时间复杂度为O(n…

Postman环境变量全局变量设置(详解版)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在公司中&#xff0c;一般会存在开发环境、测试环境、线上环境等…

找不到mfc140u.dll怎么办?修复缺失mfc140u.dll的多种方案分享

mfc140u.dll文件是一个重要的动态链接库文件&#xff0c;它在Windows操作系统中发挥着关键的作用。由于各种原因&#xff0c;例如应用程序冲突或系统错误等&#xff0c;mfc140u.dll文件有时会出现丢失的情况。一旦发生这种问题&#xff0c;运行依赖此文件的应用程序将无法正常启…

力扣刷题日记——L724. 寻找数组的中心下标

1. 前言 今天是力扣刷题日记的第二天&#xff0c;今天依旧是一道简单题啊&#xff0c;慢慢来&#xff0c;先看看题目是什么吧。 2. 题目描述 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和…

JSP中间件漏洞

jsp的注入最难挖 另外3个好挖 struts2 url有action 就代表是struts2 用漏洞利用工具 下面之这两个一般都可以用工具扫一下 、 有些网站看起来没有 action实际上我们提交了 我们的账号和密码 之后就有了 工具包是下面 这些 github上面也有 用法就是如下图 把url放进去就…

数据库驱动和url连接示例

1.MySQL 配置示例&#xff1a;↓ driver_class:com.mysql.cj.jdbc.Driver url:jdbc:mysql://IP地址:端口号/数据库名?characterEncodingUTF-8&useSSLfalse&useUnicodetrue&serverTimezoneUTC 2.MySQL(使用information_schema查询表结构) 配置示例&#xff1a;↓…

关于数据预处理的重要性

主要是为了计算机能够准确的理解数据 以下是需要处理的数据&#xff1a; 1、缺失值 仅一部分实例有值的特性&#xff0c;以及没有任何特征值的实例都被视为缺失数据 一个特征丢失了超过5%~10%的值&#xff0c;被认为是缺失数据 缺失值实例应该被删除&#xff0c;避免引入偏…

【ST-学习链接】

ST-学习链接 ■ 江科大STM32学习笔记&#xff08;上下&#xff09;■ STM32 学习&#xff08;四&#xff09;中断系统 ■ 江科大STM32学习笔记&#xff08;上下&#xff09; 江科大STM32学习笔记&#xff08;上&#xff09; 江科大STM32学习笔记&#xff08;下 ■ STM32 学习…

整数和浮点数在内存中储存的形式

整数 整数的二进制表示法有三种&#xff0c;即原码、反码、补码。 三种表示方式均有符号位和数值位 符号位位于数值位最高位的那一位&#xff0c;分别用0和1表示&#xff0c;0表示正数&#xff0c;1表示负数。 数值位&#xff0c;除最高位的那一位外其他都是数值位。 正整数…