【JAVA设计模式】之桥接模式(BridgePattern)

2023-11-15

桥接模式的作用是将两样东西连接起来,比如桥梁把河的两岸连接起来

桥接模式把“类的功能层次结构”和“类的实现层次结构”连接起来

类的层次结构

  • 类的功能层次:父类通过定义抽象方法来定义接口API
  • 类的实现层次:子类通过实现具体方法来实现接口API

示例程序

相关类一览表

类的层次 类名 描述
功能层 Express 快递寄件
功能层 EnhanceExpress (寄件)增加代收功能
实现层 ICompany 快递公司
实现层 SunFengImpl 顺丰快递
 

BridgeTest

测试类

 

 

 

 

 

 

 

示例程序类图

 

public class Express {
    private ICompany iCompany;

    public Express(ICompany iCompany) {
        this.iCompany = iCompany;
    }

    public void send() {
        iCompany.send();
    }
}
public class EnhanceExpress extends Express {
    public EnhanceExpress(ICompany iCompany) {
        super(iCompany);
    }

    public void recive() {
        System.out.println("快递人员已收件,准备发件中。。。");
        send();
    }
}
public interface ICompany {

    void send();
}

 

public class SunFengImpl implements ICompany{
    @Override
    public void send() {
        System.out.println("顺丰物流,快件已发出。。。");
    }
}
public class BridgeTest {

    public static void main(String[] args) {
        Express express = new Express(new SunFengImpl());
        EnhanceExpress enhance= new EnhanceExpress(new SunFengImpl());
        express.send();
        enhance.send();
    }
}

执行结果:

顺丰物流,快件已发出。。。
快递人员已收件,准备发件中。。。
顺丰物流,快件已发出。。。

Bridge模式使用场景

  • Abstraction(抽象化)

定义功能最上层角色Abstraction,它使用了Implementor角色的方法定义了基本功能,并保存了Implementor的实例,示例:Express

  • RefinedAbstraction(增强抽象化)

在原来Abstraction的基础上增加新功能,示例:EnhanceExpress

  • Implementor(实现者)

该角色处在“实现层”最上层,定义了具体的行为规则,示例:ICompany

  • ConcreteImplementor(具体的实现者)

它实现了Implementor定义的方法,示例:SunFengImpl

 

日常使用

桥接模式在我们web开发中也是使用最频繁的模式之一,在Controller层我们会定义各种业务处理,比如登录操作,定义UserService接口的 login() 的抽象方法,子类UserServiceImpl实现UserService的login()方法处理具体的登录操作,在Controller类中只需保存UserService对象实例。此时UserService即可认为是“桥梁”作用,连接了Controller的抽象定于与UserServiceImpl的具体实现;对UserService新增、修改的实现都不影响Controller类,以做到解耦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JAVA设计模式】之桥接模式(BridgePattern) 的相关文章

  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • 当分配给变量时,我可以以某种方式重用 Gremlin GraphTraversals 代码吗?

    我有看起来像这样的 GraphTraversals attrGroup GraphTraversal
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • 投影矩阵的推导(Deriving Projection Matrices)

    本文乃 lt 投影矩阵的推导 gt 译文 原文地址为 http www codeguru com cpp misc misc math article php c10123 1 Deriving Projection Matrices ht
  • ibmmq生产事故

    ibmmq生产事故 在代码中创建了一个没使用的mq的连接对象 也没有进行资源释放 上生产前最好确保连接队列管理器的资源在流程结束后都得到了释放 disconnect 或者进行大批量报文测试 至少需要一百笔 因为ibmmq默认通道连接数是10
  • Neo4j 5的自治图数据库集群

    原文作者 John Stegeman 图数据库产品专家 Neo4j 基于原文翻译并补充整理而成 新近发布的Neo4j 版本5推出了自治集群 Autonomous Cluster 以支持易于部署 可扩展 自容错等重要特性 下面我们就来一睹自治
  • chromedp模拟键盘回车事件

    chromedp 的 SendKeys 可以模拟各种键盘事件 并且支持组合使用 假设以下场景 有一个输入框 我们想模拟键盘输入内容并回车
  • Vuforia VirtualButtons 虚拟按键

    Vuforia VirtualButtons 虚拟按键 注意 1 不介意使用Unity自带的Vuforia 引擎 否则下载商场里的示例项目时可能会因为版本问题产生报错 推荐直接从商店下载示例的引擎使用 2 不推荐下载目前最新9 2版引擎 导
  • Matlab 函数进阶:使用匿名函数和内嵌函数处理多变量传递问题(Matlab 7.0以上)

    from http asc 2dark org node 70 Matlab 函数进阶 使用匿名函数 Anonymous Function 和内嵌函数 Nested Function 处理多变量传递问题 Matlab 7 0以上 问题 有一
  • WPF工控组态软件之温度计

    WPF以其丰富灵活的控件样式设计 相较于WinForm而言 一直是工控组态软件的宠儿 经过前两文章的学习 已经对WPF开发工控组态软件有了一个基本的了解 今天继续学习温度计的开发 仅供学习分享使用 如有不足之处 还请指正 涉及知识点 在本示
  • NotePad++遇到电脑重启或者突然崩溃,已经打开的文件信息和未保存的文件没了怎么办?

    1 崩溃前打开的文件列表信息可以在如下文件中找到 C Users 你当前用户的用户名 AppData Roaming Notepad session xml 里面存放了文件打开列表 2 崩溃前未保存的文件可以在如下路径进行恢复 C User
  • Node.js Buffer的简单使用

    Node js 目前支持的字符编码包括 ascii 仅支持 7 位 ASCII 数据 如果设置去掉高位的话 这种编码是非常快的 utf8 多字节编码的 Unicode 字符 许多网页和其他文档格式都使用 UTF 8 utf16le 2 或
  • JVM 垃圾回收

    JVM 垃圾回收 写在前面 本节常见面试题 问题答案在文中都有提到 如何判断对象是否死亡 两种方法 简单的介绍一下强引用 软引用 弱引用 虚引用 虚引用与软引用和弱引用的区别 使用软引用能带来的好处 如何判断一个常量是废弃常量 如何判断一个
  • Linux基线检查( 一)

    什么是基线 即安全基线配置 诸如操作系统 中间件和数据库的一个整体配置 这个版本中各项配置都符合安全方面的标准 比如在系统安装后需要按安全基线标准 将新机器中各项配置调整到一个安全 高效 合理的数值 风险分类 系统 等保三级 CentOS
  • linux 普通用户 Cannot create VM thread. Out of system resources.

    在linux系统下开发 使用普通用户进行应用部署 出现JVM内存问题如下 Error occurred during initialization of VM Cannot create VM thread Out of system re
  • Basic Level 1023 组个最小数 (20分)

    题目 给定数字 0 9 各若干个 你可以以任意顺序排列这些数字 但必须全部使用 目标是使得最后得到的数尽可能小 注意 0 不能做首位 例如 给定两个 0 两个 1 三个 5 一个 8 我们得到的最小的数就是 10015558 现给定数字 请
  • Python学习笔记第六十四天(Matplotlib 网格线)

    Python学习笔记第六十四天 Matplotlib 网格线 普通网格线 样式网格线 后记 Matplotlib 网格线 我们可以使用 pyplot 中的 grid 方法来设置图表中的网格线 grid 方法语法格式如下 matplotlib
  • 系统架构设计师(第二版)学习笔记----信息系统基础

    原文链接 系统架构设计师 第二版 学习笔记 信息系统基础 文章目录 一 信息系统概述 1 1 信息系统的5个基本功能 1 2 信息系统发展阶段 1 3 初始阶段的主要特点 1 4 传播阶段的主要特点 1 5 控制阶段的主要特点 1 6 集成
  • lock_guard和unique_lock

    锁 锁用来在多线程访问同一个资源时防止数据竞险 保证数据的一致性访问 多线程本来就是为了提高效率和响应速度 但锁的使用又限制了多线程的并行执行 这会降低效率 但为了保证数据正确 不得不使用锁 它们就是这样纠缠 本文主要讨论 c 11 中的两
  • 网络安全工程师的职责 103.219.28.X

    网络安全工程师是专门从事网络安全防护 攻击和事故处理等工作的技术人员 其主要职责包括 评估和分析网络漏洞和威胁情况 制定网络安全策略和方案 开发和实施安全解决方案 监控和维护网络安全系统 应对网络攻击和事故等 他们需要掌握网络安全技术 网络
  • DateTime关于时区的学习

    一 时区的概念 首先来了解时区的概念 为了解决世界不同各地在时间上的差异 人们定义了时区 时区是地球上的区域使用同一个时间定义 人们将时区分为24个 它们是中时区 零时区 东1 12区 西1 12区 每个时区横跨经度15度 时间正好是1小时
  • SQL Server临时表

    创建临时表 方法一 create table 临时表名 字段1 约束条件 字段2 约束条件 create table 临时表名 字段1 约束条件 字段2 约束条件 方法二 select into 临时表名 from 你的表 select i
  • 【JAVA设计模式】之桥接模式(BridgePattern)

    桥接模式的作用是将两样东西连接起来 比如桥梁把河的两岸连接起来 桥接模式把 类的功能层次结构 和 类的实现层次结构 连接起来 类的层次结构 类的功能层次 父类通过定义抽象方法来定义接口API 类的实现层次 子类通过实现具体方法来实现接口AP