桥接模式解析

桥接模式

  1. 意图
    • 将抽象与其实现相分离,使得两者可以独立变化。
  2. 解释
    案例:考虑武器有不同的特效,你想让不同的武器可以有不同的特效,你应该怎么做? 为每个武器创建不同的副本使得有不同的特效,还是你只单独创建单独的属性,在武器需要该属性时装配上即可。桥接模式可以让你有第二种选择。
    简单说: 桥接模式更喜欢组合模式而不是继承模式,这种模式使得实现的细节从一个对象的层次结构到另一个对象的层级结构。
  3. 样例
    //特效属性
    public interface Enchantment {
        void onActive();
        void apply();
        void onDeactive();
    }
    
    //飞行特效
    public class FlyingEnchantment implements Enchantment{
        @Override
        public void onActive() {
            System.out.println("The item begins to glow faintly");
        }
    
        @Override
        public void apply() {
            System.out.println("The item flies strikes the enemies finally returning to owner's hand");
        }
    
        @Override
        public void onDeactive() {
            System.out.println("The items's glow fades");
        }
    }
    
    
    //噬魂特效
    public class SoulEatingEnchantment implements Enchantment{
        @Override
        public void onActive() {
            System.out.println("The item spreads bloodlust");
        }
    
        @Override
        public void apply() {
            System.out.println("The item eats the soul of enemies");
        }
    
        @Override
        public void onDeactive() {
            System.out.println("The item stops spreading bloodlust");
        }
    }
    
    //武器
    public interface Weapon {
        void wield();
        void swing();
        void unwield();
        Enchantment getEnchantment();
    }
    
    //锤子
    public class Hammer implements Weapon{
        private final Enchantment enchantment;
    
        public Hammer(Enchantment enchantment) {
            this.enchantment = enchantment;
        }
    
        @Override
        public void wield() {
            System.out.println("The hammer is wielded");
            enchantment.onActive();
        }
    
        @Override
        public void swing() {
            System.out.println("The hammer is swinged");
            enchantment.apply();
        }
    
        @Override
        public void unwield() {
            System.out.println("The hammer is unwielded");
        }
    
        @Override
        public Enchantment getEnchantment() {
            return enchantment;
        }
    }
    
    
    //剑
    public class Sword implements Weapon{
    
        private final Enchantment enchantment;
    
        public Sword(Enchantment enchantment) {
            this.enchantment = enchantment;
        }
    
        @Override
        public void wield() {
            System.out.println("This sword is wielded");
            enchantment.onActive();
        }
    
        @Override
        public void swing() {
            System.out.println("The sword is swinged");
            enchantment.apply();
        }
    
        @Override
        public void unwield() {
            System.out.println("The sword is unwielded");
            enchantment.onDeactive();
        }
    
        @Override
        public Enchantment getEnchantment() {
            return enchantment;
        }
    }
    
    
    public class Main {
        public static void main(String[] args) {
            System.out.println("The knight receives an enchanted sword");
            var enchantedSword = new Sword(new SoulEatingEnchantment());
            enchantedSword.wield();
            enchantedSword.swing();
            enchantedSword.unwield();
    
            System.out.println("The valkyries receives an enchanted hammer");
            var enchantedHammer = new Hammer(new FlyingEnchantment());
            enchantedHammer.wield();
            enchantedHammer.swing();
            enchantedHammer.unwield();
        }
    }
    

在这里插入图片描述

  1. 结构图

在这里插入图片描述

  1. 适用性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wifi模块esp8266如何连接路由器访问天气

1.直接上AT指令,测试过可用 注意回车换行,所有指令都有,有一些特殊的不需要,但是基本上都需要。下面的指令都需要回车换行。/r/n [2024-01-27 02:47:23.374] TX:AT[2024-01-27 02:47:23.392] RX:ATOK[2024-…

简单介绍----微服务和Spring Cloud

微服务和SpringCloud 1.什么是微服务? 微服务是将一个大型的、单一的应用程序拆分成多个小型服务,每个服务负责实现特定的业务功能,并且可以通过网络通信与其他服务通信。微服务的优点是开发更灵活(不同的微服务可以使用不同的开…

ProRes与YUV有什么关系?ProRes还是H264/H265?

苹果的ProRes是一种视频或图片文件的编码格式。它包含ProRes 4444 XQ、ProRes 4444 、 ProRes 422 HQ、ProRes 422、ProRes 422 LT、ProRes Proxy这6种编码和ProRes RAW这种原始文件的存储格式。 我们知道,1920*1080的24p,8bit位深的RGB或者YUV444视频&…

基于InceptionV2/InceptionV3/Xception不同参数量级模型开发构建中草药图像识别分析系统,实验量化对比不同模型性能

最近正好项目中在做一些识别相关的内容,我也陆陆续续写了一些实验性质的博文用于对自己使用过的模型进行真实数据的评测对比分析,感兴趣的话可以自行移步阅读即可: 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、…

简洁思路推理 KMP 算法——子字符串匹配

例题 28. 找出字符串中第一个匹配项的下标 暴力遍历解法 枚举原串 ss 中的每个字符作为「发起点」,每次从原串的「发起点」和匹配串的「首位」开始尝试匹配: 匹配成功:返回本次匹配的原串「发起点」。 匹配失败:枚举原串的下一个…

PC机组成之主板、芯片组与BIOS

PC机组成 台式PC由主机和外部设备组成,主机由主板、CPU、内存条、显卡、网卡、声卡、插卡和插座、机箱和电源等组成。 主板、芯片组和BIOS 主板 主板也称母版,是微型计算机中最大的一块集成电路板,也是其他部件和设备的连接载体。 CPU、内…

EndNote20 添加GBT7714文献格式

GBT 7714格式是中国国家标准《文后参考文献著录规则》的规定,用于指导学术论文、期刊文章等文献的参考文献著录。GBT 7714标准规定了参考文献的格式、内容和著录要求,以确保文献的一致性和标准化。 在EndNote 20中,若需要按照GBT 7714格式在W…

04.领域驱动设计:了解聚合和聚合根,怎样设计聚合-学习总结

目录 1、概述 2、聚合 3、聚合根 4、怎么设计聚合 4.1 聚合的构建过程主要步骤 第 1 步:采用事件风暴。 第 2 步:选出聚合根。 第 3 步:找出与聚合根关联的所有紧密依赖的实体和值对象。 第 4 步:画出对象的引用和依赖模型…

支持下一代网络IpV6的串口服务器,IpV6串口485接口转网口

和IPv4比较,IPv6有两个极具吸引力的特点:一个是IPv6采用的128位地址格式,而IPv4采用32位的地址格式,因此IPv6使地址空间增大了296;另一个是IPv6物联网数据业务具有更强的支持能力,成为未来物联网的重要协议…

体验 AutoGen Studio - 微软推出的友好多智能体协作框架

体验 AutoGen Studio - 微软推出的友好多智能体协作框架 - 知乎 最近分别体验了CrewAI、MetaGPT v0.6、Autogen Studio,了解了AI Agent 相关的知识。 它们的区别 可能有人要问:AutoGen我知道,那Autogen Studio是什么? https://g…

82 C++对象模型探索。数据语义学 - 单一继承下的数据成员布局

在使用继承后,由于内存对齐的影响,会带来内存空间的额外增加。 windows 和 linux 的图示: 对于windows,在继承时,子类中应该包含父类的全部,包括了父类内存对齐时空的内存部分。 对于linux,编…

pytorch-metric-learning度量学习工具官方文档翻译

基于Pytorch实现的度量学习方法 开源代码:pytorch-metric-learning官网文档:PyTorch Metric Learning官方文档 度量学习相关的损失函数介绍: 度量学习DML之Contrastive Loss及其变种度量学习DML之Triplet Loss度量学习DML之Lifted Structu…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-菜单管理实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

【大数据】详解 Flink 中的 WaterMark

详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…

ubuntu20.04 安装ROS2 记录

主要参考B站古月居的ROS2入门21讲 和 以下链接(基本和视频上一致) ubuntu20.04安装ROS2 详细教程_ubuntu20.04 ros2-CSDN博客 但是中间有些需要注意的地方, 1,添加源 步骤中提到 sudo curl -sSL https://raw.githubuserconten…

基于QC-LDPC编码的循环移位网络的FPGA实现

一、桶式移位寄存器(barrel shifter) 八位桶式移位寄存器的VHDL实现如下,由于每一层结构相似,于是采用生成语句for_generate实现,使用该代码实现的RTL级分析和理论的结构一致,仿真结果也符合预期。 entity barrel_shift isGENE…

【RT-DETR有效改进】反向残差块网络EMO | 一种轻量级的CNN架构(轻量化网络,参数量下降约700W)

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

文件上传之大文件分块上传进度控制处理

在分块上传内容结束以后的事件监听,我们会实现 unlinkSync 删除临时文件操作,那么试想一下,在这个事件监听中,我们是否可以通过totalChunks以及currentChunk获取当前上传的进度情况呢? 后端 upload上传接口&#xff…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-友情链接管理实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

在 React 组件中使用 JSON 数据文件,怎么去读取请求数据呢?

要在 React 组件中使用 JSON 数据&#xff0c;有多种方法。 常用的有以下几种方法&#xff1a; 1、直接将 JSON 数据作为一个变量或常量引入组件中。 import jsonData from ./data.json;function MyComponent() {return (<div><h1>{jsonData.title}</h1>&…