12,桥接模式-露娜的召唤师技能

article/2025/7/4 7:40:39

一,前言

7种结构型设计模式:桥接模式,适配器模式,装饰模式,组合模式,享元模式,外观模式,代理模式上篇我们说了装饰模式:动态地将责任附加到对象上,在不修改任何底层代码的情况下,为对象赋予新的职责开发中,我们经常会遇到一个类有两个或两个以上的维度经常在变化
如果我们使用继承的方式实现:对一个抽象做多种实现
我们会发现由于变化的维度太多,可能无法实现或是设计变得十分臃肿这种时候,我们特别希望这个两个维度可以独立变化
即将实现和抽象放在两个不同的类层次中,使他们可以独立拓展,不会影响到对方桥接模式将变化的部分抽象出来,使变化的部分与主类分离,从而将多个维度的变化彻底分离。
桥接模式提供一个管理类组合不同维度上的变化,通过这种组合完成灵活的设计今天我们来说桥接模式,有了桥接的存在,就可以独立的改变这两个层次了

二,问题&解决

1,两个维度的例子:

上边我们说受两个维度的变化,为了方便理解,我们举一个具体例子做分析:以学校选课为例:
学校有数学系和计算机系
课程包含数学课和英语课
数学课分数学分析和高等数学
英语课分数学英语和计算机英语选课要求:
数学系只能选择数学分析和数学英语
计算机系只能选择高等数学和计算机数学两个维度为系和课程,多个系和多种课程(eg:数学,计算机)及其不同子类(eg:数学分析和数学英语)

2,问题所在

如果使用继承的方式实现,我们可能要实现多种子类:
计算机系->高等数学
计算机系->计算机英语
数学系->数学分析
数学系->数学英语
...
相当于排列组合的结果,假设我们有10个系,20门课程,子类数量就相当大了
最主要的问题在于,如果其中的一个纬度发生变化,那么涉及到这个维度的所有子类都需要修改代码
对于开发者来说,无论是维度的新增或者是修改,都会设计很大的修改量

3,继承的局限性

有时候过分的使用继承会带来一些麻烦对象的继承关系是在变异的时候就规定好了,运行时子类无法改变从父类继承来的实现
子类和父类之前是一种强依赖关系,所以我们说,继承从某种意义上讲是一种耦合这就导致了父类中的某个实现的改变会影响子类的实现
当子类需要被复用时,会由于其继承关系的实现是它不适合解决新的问题

4,我们期望的

对于这种多维度变化的需求,我们希望可以将多个维度拆开,使他们可以独立拓展,而不会影响到对方

5,合成/聚合复用原则

这里我们引入一个设计上的原则:合成/聚合复用原则
尽量使用合成/聚合,尽量不要使用类继承
优先使用合成/聚合,在合成/聚合解决不了问题的情况下再使用继承聚合:表示一种弱"拥有"关系
比如,对象A可以包含对象B,但对象B不一定是对象A的一部分
合成:表示一种强"拥有"关系
是严格的部分与整体的关系,具有相同的生命周期合成/聚合复用原则的优点:
类与类继承的层次规模较小,每个类独立封装且职责单一拿选课的例子来分析:
每个系给学生准备的可选课程可以包含数学课程,也可以不包含数学课程
所以系和课程之间的关系为聚合关系类A会使用类B的对象,那么类A就算是类B的一个聚合
即,如果类A持有类B对象的引用,那么类A就算是类B的一个聚合

三,桥接模式

有了以上的知识储备,我们可以来看一下桥接模式了

1,桥接模式的定义:

桥接模式通过将实现和抽象放在两个不同的类层次中而使他们可以独立改变

2,桥接模式类图

桥接模式类图

从类图我们可以看出:Abstraaction抽象类是implementor接口的一个聚合(持有implementor的引用)通过这种聚合关系创建出一个桥将两个维度的具体实现进行组合,即抽象的类层次与实现的类层次使他们可以独立维护,互不影响,解除耦合

3,桥接模式的理解

到这里,对于桥接的认识还是相对抽象的,不能理解他的概念
通过学生选课的这个例子,主要为了说明,桥接模式适用于这种排列组合式的需求现在我们假设有一座桥
桥的A侧,有A1,A2,A3
桥的B侧,有B1,B2,B3A----------------B
A1              B1
A2              B2
A3              B3从A侧到B测,可以有以下方式:
A1B1,A1B2,A1B3,A2B1,A2B2,A2B3,A3B1,A3B2,A3B3这九种情况
这就是桥接模式所要解决的问题

4,桥接模式的方向性

桥接模式应对的场景是有方向性的
桥绑定的一方都是被调用者,属于被动方
抽象方属于主动方

5,jdk中的桥接模式

JDK提供的JDBC数据库访问接口API是经典的桥接模式实现,
接口内部可以通过实现接口来扩展针对不同数据库的具体实现来进行扩展,
而对外的仅仅只是一个统一的接口调用

四,桥接模式的场景

下面我们选一个场景来使用桥接模式
当然这次我又选取了王者荣耀里的一个场景,可能不是非常的恰当,但刚好可以使用上这个模式选择游戏英雄时,我们还会为英雄选择一个召唤师技能
游戏中有多个英雄,多个召唤师技能可以组合搭配

露娜

召唤师技能


四,桥接模式的例子

项目结构图如下:

桥接模式项目结构

1,创建抽象层–召唤师技能

package com.brave.bridge.pesticide.skill;/*** 抽象技能* * @author Brave**/
public interface Skill {String getName();}

2,创建抽象层–英雄,持有召唤师技能的引用(二者是聚合关系)

package com.brave.bridge.pesticide.hero;import com.brave.bridge.pesticide.skill.Skill;public abstract class Hero {protected Skill skill;public void setHeroSkill(Skill skill){this.skill = skill;}public abstract void showHeroSkill();}

3,继承抽象英雄创建具体英雄-露娜,孙悟空

package com.brave.bridge.pesticide.hero;import com.brave.bridge.pesticide.skill.Skill;/*** 具体英雄-露娜* @author Brave**/
public class Luna extends Hero {private String name = "露娜";@Overridepublic void showHeroSkill() {System.out.println("英雄 : " + name + ", 装备技能 : " + skill.getName());}}
package com.brave.bridge.pesticide.hero;import com.brave.bridge.pesticide.skill.Skill;/*** 具体英雄-孙悟空* 初始暴击率为20%,暴击伤害150%;* * @author Brave**/
public class MonkeyKing extends Hero {private String name = "孙悟空";@Overridepublic void showHeroSkill() {System.out.println("英雄 : " + name + ", 装备技能 : " + skill.getName());}}

4,实现召唤师技能接口,创建具体召唤师技能-闪现,打野,加速

package com.brave.bridge.pesticide.skill;/*** 具体技能-闪现* @author Brave**/
public class Flash implements Skill {@Overridepublic String getName() {return "闪现";}}
package com.brave.bridge.pesticide.skill;/*** 具体技能-打野* @author Brave**/
public class Jungle implements Skill {@Overridepublic String getName() {return "打野";}}
package com.brave.bridge.pesticide.skill;/*** 具体技能-加速* @author Brave**/
public class SpeedUp implements Skill {@Overridepublic String getName() {return "加速";}}

5,测试桥接模式

package com.brave.bridge.pesticide;import com.brave.bridge.pesticide.hero.Hero;
import com.brave.bridge.pesticide.hero.Luna;
import com.brave.bridge.pesticide.hero.MonkeyKing;
import com.brave.bridge.pesticide.skill.Flash;
import com.brave.bridge.pesticide.skill.Jungle;
import com.brave.bridge.pesticide.skill.Skill;
import com.brave.bridge.pesticide.skill.SpeedUp;/*** 测试桥接模式* * @author Brave**/
public class Client {public static void main(String[] args) {// 实例化召唤师技能Skill flash = new Flash();//闪现Skill jungle = new Jungle();//打野Skill speedUp = new SpeedUp();//加速// 实例化英雄Hero Luna = new Luna();Hero monkeyKing = new MonkeyKing();// 为英雄桥接召唤师技能Luna.setHeroSkill(flash);Luna.showHeroSkill();Luna.setHeroSkill(jungle);Luna.showHeroSkill();Luna.setHeroSkill(speedUp);Luna.showHeroSkill();monkeyKing.setHeroSkill(flash);monkeyKing.showHeroSkill();monkeyKing.setHeroSkill(jungle);monkeyKing.showHeroSkill();monkeyKing.setHeroSkill(speedUp);monkeyKing.showHeroSkill();}}

打印输出:

英雄 : 露娜, 装备技能 : 闪现
英雄 : 露娜, 装备技能 : 打野
英雄 : 露娜, 装备技能 : 加速
英雄 : 孙悟空, 装备技能 : 闪现
英雄 : 孙悟空, 装备技能 : 打野
英雄 : 孙悟空, 装备技能 : 加速

五,桥接模式的优点与缺点

优点:

将实现解耦,让他和界面之间不再永久绑定
抽象和实现可以独立拓展,不会影响到对方
对于"具体的抽象类"所做的改变.不会影响到客户端

缺点:

增加了代码复杂度

http://chatgpt.dhexx.cn/article/xndePYUt.shtml

相关文章

浮标水质监测站是什么

浮标水质监测站是设立在河流、湖泊、水库、近岸海域等流域内进行现场水质自动监测的监测仪器,是以水质监测仪为核心,运用传感器技术,结合浮标体、电源供电系统、数据传输设备组成的放置于水域内的小型水质监测系统。用于连续自动监测被测水体…

【赛纳斯】EC Raman电化学拉曼光谱检测系统推动科研新突破

【前言】   近日,Angew在线发表了厦门大学李剑锋教授团队在设计用于氧还原反应的先进材料及改进催化剂的设计最 新综述文章。该论文综述了双金属纳米催化剂有序度对氧还原反应的影响。论文第 一作者为:Heng-Quan Chen,Huajie Ze,Mu-Fei Yue,论文共同通讯作者为&am…

Ethercat学习-从站源码移植

文章目录 简介移植源码1.源码结构2.GD32硬件接口准备1.SPI接口2.PDI中断配置3.Sync0中断配置4.Sync1中断配置5.定时器中断配置 3.移植准备4.源码移植1.修改头文件名2.ecatport.c文件修改1.SPI部分修改2.中断部分3.修改HW_Init()4.报错修改 3.myapp.c文件修改 5.其他 简介 移植…

小说php 站点源码下载,PTCMS小说站源码

必装环境:nginx(apache.iis 也可),mysql,php5.6,memcached php5.6 安装扩展 memcache 新建站点,注意新建时,PHP 版本必须选择 PHP5.6,不然程序会报错 1.上传网站文件到网站目录,新建网站伪静态选择 thinkph…

PHP是什么

PHP 是服务器端脚本语言。 您应当具备的基础知识 在继续学习之前,您需要对以下知识有基本的了解: HTMLCSS 如果您希望首先学习这些项目,请在我们的 首页 访问这些教程。 PHP 是什么? PHP 代表 PHP: Hypertext PreprocessorPHP 是一…

国家地表水水质自动监测站坐标每四小时数据(共1952个监测站,含省份、城市、河流、流域、断面名称、监测时间、水温、pH、DO、CODMn、TP、TN、NH3-N、浊度等)

1.监测范围 国家地表水水质自动监测网1952 个水质自动监测站。2.监测项目 监测项目为国家水质自动监测站配备的监测指标,主要包括五参数(水温、pH、溶解氧、电导率和浊度)、氨氮、高锰酸盐指数、总氮、总磷,部分水站增测总有机碳、叶绿素a、藻密度、VOCs…

php 跨站脚本,Piwigo register.php页面多个跨站脚本漏洞

发布日期:2010-05-06 更新日期:2010-05-11 受影响系统: Piwigo project Piwigo 2.0.9 描述: -------------------------------------------------------------------------------- BUGTRAQ ID: 39958 CVE(CAN) ID: CVE-2010-1707…

基于Modbus RTU 485通信协议实现对PH、溶解氧传感器的数据采集

modbus rtu 485协议采用的是一主多从方式通信,主机是普中的stm32f103zet6开发板,从机是传感器。代码已经在实物上测试通过,并且也用modbus精灵测试通过了。如果你没有stm32基础的话,建议先去B站搜索“正点原子”了解一下485串口通…

3、基于51单片机的智能水箱控制系统-温度-PH值-水位(仿真+程序+原理图)

目录 基于51单片机的智能水箱控制系统1、主要功能2、实验结果3、仿真工程4、原理图5、程序源码6、资源获取 基于51单片机的智能水箱控制系统 1、主要功能 51单片机检测水箱内温度,ph值;使用pid算法控制温度到设置值;普通控制ph值到设定值&a…

如何下载y站视频

今天看到了一篇B站视频的下载方法,学习了下,然后去看了下y站是不是也能下下来,居然被我试出来了,嘿嘿 B站文章链接:https://blog.csdn.net/Enderman_xiaohei/article/details/94718494 然后看一下y站的,打…

基于STM32(HAL库)的水质检测(浑浊度、PH值、温度、手机APP显示、wifi上云)

本系统由通过wifi将浑浊度、PH值、温度采集的数据发送到手机APP,超过设定的阈值报警。 一、硬件材料清单: 1、STM32C8T6:控制器 2、OLED显示屏:显示传感器采集的数据 3、PH传感器:检测PH值 4、TDS传感器&#xff1…

JEB动态调试与篡改攻防世界Ph0en1x-100

文章目录 题目APK静态分析jadx反编译IDA反汇编 JEB动态调试工具的使用操作内存值 AndroidKiller工具的使用篡改软件包 总结 题目 攻防世界 Mobile 新手区题目链接 Ph0en1x-100,如下: 下载附件得到一个 apk,安装后如下: 要求输入…

php 抓站,如何跨站抓取别的站点的页面的补充

如何跨站抓取别的站点的页面的补充 更新时间:2006年10月09日 00:00:00 作者: 在实际的应用中,经常会遇到一些特殊的情况,比如需要新闻,天气预报,等等,但是作为个人站点或者实力小的站点 我们不…

用python计算ph,用python下载PH上的学习视频

努力学习,天天向上 闲来无事,用python写个脚本下载PH上的学习视频 环境:python3 用法:python ph_downloader.py viewkey viewkey是PH上的一串字符 代码在 https://paste.ubuntu.com/p/jXVYD3NGP9 多线程下载,网络不好时…

浮标水质监测站--河流湖泊水库现场水质自动监测的解决方案

浮标水质监测站--河流湖泊水库现场水质自动监测的解决方案 什么是浮标水质监测站? 浮标水质监测站是设立在河流、湖泊、水库、近岸海域等流域内进行现场水质自动监测的监测仪器,是以水质监测仪为核心,运用传感器技术,结合浮标体…

html全屏背景视频特效,HTML5全屏背景视频特效插件Vidage.js源码

下面我们对HTML5全屏背景视频特效插件Vidage.js源码文件阐述相关使用资料和HTML5全屏背景视频特效插件Vidage.js源码文件的更新信息。 HTML5全屏背景视频特效插件Vidage.js源码 本特效是一款移动友好的基于HTML5插件Vidage.js实现全屏背景视频特效的代码。Vidage.js可以在手机或…

html背景图片只显示一张图片,img只显示图片一部分 或 css设置背景图片只显示图片指定区域(示例代码)...

17:14 2016/3/22 img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左上角为0,0或0%,0%,右下角为高度和宽度,或100%,10…

html的背景图片设置

背景颜色:background-color,可用rgb、rgba、#off等进行设置 背景图片:background-img,可用网址或图片存放地址进行设置 平铺方式: background-repeat:repeat,在背景上只出现一张图片,没有设置…

Html手机web背景全屏,使用全屏背景的网页设计欣赏 全屏网页背景教程

使用全屏背景的网页设计欣赏 & 全屏网页背景教程 Sponsor 全屏的大背景网站之前分享过不少,这是2012年以及2013年的设计趋势,适合用全屏背景的网站有很多,比如摄影类、建筑类、餐厅美食行业等等。全屏背景不仅仅是一些插画及设计图&#…

html背景全屏,23个使用大背景的全屏网页设计作品

23个使用大背景的全屏网页设计作品 7月 20, 2015 评论 (2) Sponsor 在2013年的时候使用全屏背景或者大图片的网页开始流行起来,到了今年,还是经常看到这类风格的页面出现,可见这个趋势还是很流行的,值得运用。 一张大图再配合一个…