【设计模式】JAVA Design Patterns——Bridge(桥接模式)

🔍目的


将抽象与其实现分离,以便二者可以独立变化。

🔍解释


真实世界例子

考虑一下你拥有一种具有不同附魔的武器,并且应该允许将具有不同附魔的不同武器混合使用。 你会怎么做? 为每个附魔创建每种武器的多个副本,还是只是创建单独的附魔并根据需要为武器设置它? 桥接模式使您可以进行第二次操作

通俗描述

桥接模式是一个更推荐组合而不是继承的模式。将实现细节从一个层次结构推送到具有单独层次结构的另一个对象。

维基百科

桥接模式是软件工程中使用的一种设计模式,旨在“将抽象与其实现分离,从而使两者可以独立变化”

程序示例

创建一个武器类层级

public interface Weapon {void wield();void swing();void unwield();Enchantment getEnchantment();
}public class Sword implements Weapon {private final Enchantment enchantment;public Sword(Enchantment enchantment) {this.enchantment = enchantment;}@Overridepublic void wield() {LOGGER.info("The sword is wielded.");enchantment.onActivate();}@Overridepublic void swing() {LOGGER.info("The sword is swinged.");enchantment.apply();}@Overridepublic void unwield() {LOGGER.info("The sword is unwielded.");enchantment.onDeactivate();}@Overridepublic Enchantment getEnchantment() {return enchantment;}
}public class Hammer implements Weapon {private final Enchantment enchantment;public Hammer(Enchantment enchantment) {this.enchantment = enchantment;}@Overridepublic void wield() {LOGGER.info("The hammer is wielded.");enchantment.onActivate();}@Overridepublic void swing() {LOGGER.info("The hammer is swinged.");enchantment.apply();}@Overridepublic void unwield() {LOGGER.info("The hammer is unwielded.");enchantment.onDeactivate();}@Overridepublic Enchantment getEnchantment() {return enchantment;}
}

创建单独的附魔类

public interface Enchantment {void onActivate();void apply();void onDeactivate();
}public class FlyingEnchantment implements Enchantment {@Overridepublic void onActivate() {LOGGER.info("The item begins to glow faintly.");}@Overridepublic void apply() {LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand.");}@Overridepublic void onDeactivate() {LOGGER.info("The item's glow fades.");}
}public class SoulEatingEnchantment implements Enchantment {@Overridepublic void onActivate() {LOGGER.info("The item spreads bloodlust.");}@Overridepublic void apply() {LOGGER.info("The item eats the soul of enemies.");}@Overridepublic void onDeactivate() {LOGGER.info("Bloodlust slowly disappears.");}
}

原神启动!

var enchantedSword = new Sword(new SoulEatingEnchantment());
enchantedSword.wield();
enchantedSword.swing();
enchantedSword.unwield();
// The sword is wielded.
// The item spreads bloodlust.
// The sword is swinged.
// The item eats the soul of enemies.
// The sword is unwielded.
// Bloodlust slowly disappears.var hammer = new Hammer(new FlyingEnchantment());
hammer.wield();
hammer.swing();
hammer.unwield();
// The hammer is wielded.
// The item begins to glow faintly.
// The hammer is swinged.
// The item flies and strikes the enemies finally returning to owner's hand.
// The hammer is unwielded.
// The item's glow fades.

🔍类图

Bridge class diagram 

🔍适用场景

使用桥接模式当

  • 你想永久性的避免抽象和他的实现之间的绑定。有可能是这种情况,当实现需要被选择或者在运行时切换。
  • 抽象和他们的实现应该能通过写子类来扩展。这种情况下,桥接模式让你可以组合不同的抽象和实现并独立的扩展他们。
  • 对抽象的实现的改动应当不会对客户产生影响;也就是说,他们的代码不必重新编译。
  • 你有种类繁多的类。这样的类层次结构表明需要将一个对象分为两部分。Rumbaugh 使用术语“嵌套归纳”来指代这种类层次结构。
  • 你想在多个对象间分享一种实现(可能使用引用计数),这个事实应该对客户隐藏。一个简单的示例是Coplien的String类,其中多个对象可以共享同一字符串表示形式


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

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

相关文章

【论文阅读】 YOLOv10: Real-Time End-to-End Object Detection

文章目录 AbstractIntroductionRelated WorkMethodologyConsistent Dual Assignments for NMS-free Training (无NMS训练的一致性双重任务分配)Holistic Efficiency-Accuracy Driven Model Design (效率-精度驱动的整体模型设计) …

huggingface 笔记:查看GPU占用情况

0 准备部分 0.1 创建虚拟数据 import numpy as npfrom datasets import Datasetseq_len, dataset_size 512, 512 dummy_data {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size…

C++与Android处理16进制大端/小端数据实例(二百七十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

民国漫画杂志《时代漫画》第14期.PDF

时代漫画14.PDF: https://url03.ctfile.com/f/1779803-1247458399-6732ac?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!

OWASP top10--SQL注入(一)

SQL注入式攻击技术,一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数,提交SQL查询语句,并传递至服务器端…

基本IO接口

引入 基本输入接口 示例1 示例2:有数据保持能力的外设 #RD端由in指令控制:将数据由端口传输到CPU内存中 #CS244信号由译码电路实现 示例3: a)图中由于输出端口6有连接到端口1,当开关与端点1闭合时期间,仍能维持3端口…

使用DataGrip连接Elasticsearch

使用DataGrip连接Elasticsearch 前言,公司需要使用ES来做数据的查询,我安装完ES,安装完Kibana的时候,想先开始尝试一下,插入查询数据能否可用,但是上次使用ES是好久前了,增删改查的请求根本记不…

欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理和高斯消元

欧拉函数 给定 n 个正整数 ai,请你求出每个数的欧拉函数。 欧拉函数的定义1∼N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)。 若在算数基本定理中,Np1a11p2a2…pmm,则:ϕ(N) Np1−1/p1p2−1/p2…pm−1/pm 输…

javas-core VS java-object-diff

对照工具选择 javas-core 和 java-object-diff ,对比demo https://github.com/kofgame/objectdiff-vs-javers,都为同源对比,都支持嵌套对象。 使用JMH测试方法进行性能测试,使用题库的QuestionResponseVO对象来进行对照对比,进行…

mac上简单实现一个java调用C接口的JNI

目录 安装JDK及配置环境变量写Java代码生成头文件实现本地方法编译本地代码运行 Java 程序总结步骤 安装JDK及配置环境变量 参考:MAC系统安装JDK1.8及环境变量配置 写Java代码 // 文件名:Calculator.java public class Calculator {// 声明本地方法pu…

如何禁止U盘拷贝文件|禁止U盘使用的软件有哪些

禁止U盘拷贝文件的方法有很多,比如使用注册表、组策略编辑器等,但这些方法都适合个人,不适合企业,因为企业需要对下属多台电脑进行远程管控,需要方便、省时、省力的方法。目前来说,最好的方法就是使用第三方…

嵌入式单片机笔试题

DC-DC 和 LDO两者有何区别? DC-DC转换器(直流-直流转换器)和LDO(低压差线性稳压器)都是用于电源管理的设备,但它们在原理和特性上有一些显著的区别: 原理: DC-DC转换器通过改变输…

WGCAT工单系统如何配置通知

WGCAT工单系统可以配置邮件通知 只要配置了邮件通知,那么一旦我们账号有新的工单需要处理,就会接受到邮件通知 除了邮件之外,还可以配置其他方式的通知,比如微信钉钉短信等方式,参考如下 https://www.wgstart.com/wgc…

2024年贵州特岗教师招聘报名流程,速速查收哦!

2024年贵州特岗教师招聘报名流程,速速查收哦!

利用开源工具创建WEBGIS应用

在本文中,我们将大致说明利用开源工具如何与服务器交互以构建交互式或动态 Web GIS。 WebGIS 应用程序已成为展示地理数据的重要模式。我们现在拥有允许用户交互的机制,以便用户可以选择数据,甚至修改或添加新数据。 什么是WEBGIS? 通过网络…

博客说明 5/12~5/24【个人】

博客说明 5/12~5/24【个人】 前言版权博客说明 5/12~5/24【个人】对比最后 前言 2024-5-24 13:39:23 对我在2024年5月12日到5月24日发布的博客做一下简要的说明 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作…

嵌入式单片机启动地址映射关系

一、内核只会从0地址启动 1.0地址第一个字是sp栈指针,第二个字是Reset_Handler入口,参考图1中启动代码中的中断向量表。具体使用流程参考图2(参考自野火) 图1 图2 2.0地址映射以后,软件上使用0地址访问的空间是映射到的器件的空间 3.0地址映射只会影响单个器件上的地址,…

轻量级 K8S 环境 安装minikube

文章目录 操作系统DockerDocker CE 镜像源站使用官方安装脚本自动安装 (仅适用于公网环境)安装校验Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard参考资料 操作系统 …

AI大模型探索之路-基础篇5:GLM-4解锁国产大模型的全能智慧与创新应用

目录 前言一、GLM4大模型总体概述二、GLM4和GPT4功能对比三、GLM4和GPT4性能对比1、基础能力(英文)2、指令跟随能力3、对齐能力4、长文本能力5、多模态-文生图 四、GLM-4 ALL Tools1、文生图2、代码解释器3、网页浏览4、Function Call5、多工具自动调用 …

23种设计模式(持续输出中)

一.设计模式的作用 设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架,它提高了代码的可维护性、可扩展性、可读性以及复用性。 二.设计模式 1.工厂模式 工厂模式提供了创建对象的接口,而无需制定创建对象的具体类,工厂类…