用23种设计模式打造一个cocos creator的游戏框架----(十一)桥接模式

news2024/11/17 1:40:36

1、模式标准

模式名称:桥接模式

模式分类:结构型

模式意图:将抽象部分与其实现部分分离,使它们都可以独立地变化。

结构图:

适用于:

1、不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。

2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是 Bridge 模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

3、对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译

4、想在多个对象间共享实现 (可能使用引用计数),但同时要求客户并不知道这一点 

主要成员:

  • 抽象类(Abstraction):定义和保存客户端的引用,维护与实现对象之间的关联关系。
  • 扩展抽象类(Refined Abstraction):扩展和精化抽象类中的接口定义。
  • 实现类接口(Implementor):定义实现类的接口,可以与抽象类的接口相互独立。
  • 具体实现类(Concrete Implementor):具体实现接口,在不同的实现类中提供基本操作的不同实现。

2、分析与设计  

桥接模式,通俗点讲就如同嫁接,比如有一个树,会开花结果,我给它嫁接苹果枝,在开花结果后,长的是苹果。如果嫁接橘子枝,在开花结果后,长的是橘子。

在游戏开发中,可能会用在角色的武器切换上,不同的武器拥有不同的攻击方式。拥有剑就拥有了剑的攻击效果,拥有弓箭就拥有弓的攻击效果。下面我们来描述一下新的意图

意图:将抽象部分(攻击)与其实现部分(剑攻击还是弓箭攻击)分离,使它们都可以独立地变化(剑有剑的攻击效果,弓有弓的攻击效果)。

当前的例子用在角色的攻击方式的设计上。下面我们来描述一下新的意图

意图:将抽象部分(攻击)与其实现部分(近程攻击还是远程攻击)分离,使它们都可以独立地变化(近程的攻击立即生效,远程的攻击等抛射物接触到单位攻击生效)。

3、开始打造

 上图的第一版的结构图不太标准(因为桥接模式属于结构性模式,抽象与实现可以独立地变化,并在编译时通过组合的方式耦合在一起。而第一版中将setWeapon加进去,武器是看上去是一种可以动态替换的,会和后面的策略模式搞混)。下图是新的将“攻击方式”代替武器,因为攻击方式一般在角色构建好后就定了,不会随意切换。(后面的策略模式会引入武器,实现策略模式和桥接模式混用)

 

// 攻击方式接口
export interface IAttackStrategy {
    attack(): void;
}

// 近程攻击
export class MeleeAttack implements IAttackStrategy {
    attack(): void {
        console.log("进行近程攻击:");
    }
}

// 远程攻击
export class RangedAttack implements IAttackStrategy {
    attack(): void {
        console.log("进行远程攻击:");
    }
}
// 抽象战斗者
export abstract class Fighter {
    protected attackStrategy: IAttackStrategy;

    constructor(attackStrategy: IAttackStrategy) {
        this.attackStrategy = attackStrategy;
    }

    attack(): void {
        this.attackStrategy.attack();
    }

}
// 骑兵
export class Cavalry extends Fighter {
    constructor(attackStrategy: IAttackStrategy) {
        super(attackStrategy);
    }
}

// 弓箭手
export class Archer extends Fighter {
    constructor(attackStrategy: IAttackStrategy) {
        super(attackStrategy);
    }
}

4、开始使用

export class UnitItem extends Component implements IItem, IUnitItem {

    private ad: number = 100;
    private role: Fighter;

    accept(visitor: IAttackVisitor) {
        visitor.visitUnitItem(this)
    }

    async attack(unitItem: UnitItem<T>) {
        this.role.attack(); // 攻击

        let damage = this.ad
        let attackVisitor = new MonomerAttackVisitor(damage)
        unitItem.accept(attackVisitor)
    }

    setRole(role: Fighter): void {
        this.role = role;
    }
}
let unitItem001 = xhgame.itemFactory.createUnitItem('shibing_001')
let unitItem002 = xhgame.itemFactory.createUnitItem('shibing_002')

unitItem001.setRole(new Cavalry(new MeleeAttack()));
console.log('unitItem001(骑兵-近程)对unitItem002发起了攻击')
unitItem001.attack(unitItem002)

unitItem002.setRole(new Cavalry(new RangedAttack()));
console.log('unitItem002(骑兵-远程)对unitItem001发起了攻击')
unitItem002.attack(unitItem001)

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

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

相关文章

高并发如何实现单用户信息查询接口

高并发如何实现单用户信息查询接口 故事情节 产品&#xff1a;小李&#xff0c;有个单用户信息查询的功能&#xff0c;需要你实现一下小李&#xff1a;这还不简单&#xff0c;两分钟我给你实现两分钟过去…小李&#xff1a;欧克了&#xff0c;部署上线了运维&#xff1a;哪个…

Nessus漏洞扫描报错:42873 - SSL Medium Strength Cipher Suites Supported (SWEET32)

个人搭建的windows server 2019服务器,被Nessus工具扫描出现三个漏洞,修复比较过程比较坎坷,特记录下 首先:报错信息: 42873 - SSL Medium Strength Cipher Suites Supported (SWEET32) 104743 - TLS Version 1.0 Protocol Detection 157288 - TLS Version 1.1 Protocol …

网络互通--三层交换机配置

目录 一、三层交换机的原理 1、概念 2、PC A与不同网段的PC B第一次数据转发过程 3、一次路由&#xff0c;多次转发的概念 4、 三层交换机和路由器的比较 二、利用实验理解交换机 1、建立以下拓扑图​编辑 2、分别配置主机的IP地址&#xff0c;子网掩码、网关等信息 3、…

自然语言处理阅读第一弹

Transformer架构 encoder和decoder区别 Embeddings from Language Model (ELMO) 一种基于上下文的预训练模型,用于生成具有语境的词向量。原理讲解ELMO中的几个问题 Bidirectional Encoder Representations from Transformers (BERT) BERT就是原生transformer中的Encoder两…

用23种设计模式打造一个cocos creator的游戏框架----(十七)命令模式

1、模式标准 模式名称&#xff1a;命令模式 模式分类&#xff1a;行为型 模式意图&#xff1a;将一个请求封装为一个对象&#xff0c;从而使得可以用不同的请求对客户进行参数化:对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 结构图&#xff1a; 适用于&am…

2024年20多个最有创意的AI人工智能点子

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 探索 2024 年将打造的 20 个基于人工智能产品的盈利创意 &#x1f525;&#x1f525;&#x1f525; 直到最近&#xff0c;企业对人工智能还不感兴趣&#xff0c;但…

基于C/C++的libcurl多协议文件传输库dll二次封装开发使用

libcurl 可能是最便携、最强大和最常用的 这个星球上的网络传输库。官方提供的示例&#xff0c;需要在项目中引用到libcurl-imp.lib才能使用。 这里我改造了下工程&#xff0c;将常用的接口导出到了libcurl.dll中方便直接在后续的工程代码中应用&#xff0c;下面可以看到dll常用…

使用广播星历进行 GPS 卫星位置的计算

目录 1.计算卫星运动的平均角速度 n 2.计算观测瞬间卫星的近地点角 3.计算偏近点角 4.计算真近点角 f 5.计算升交角距 6.计算摄动改正项 7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置 9.计算观测瞬间升交点的经度 L 10.计算卫星在瞬时地球坐标系中的位置 11.…

最大子数组和java实现【动态规划基础练习】

12.15 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4]…

笔记本电脑如何安装爱快软路由

环境&#xff1a; dell3490 笔记本 装机U盘 问题描述&#xff1a; 笔记本电脑如何安装爱快软路由 解决方案&#xff1a; 1.电脑bios关闭 安全启动 2.下载官网镜像 3.UEFI引导 在PE下面 新建esp分区300M 把系统镜像里面全部文件&#xff0c;提取到这个分区 最后&…

数据结构(7.5)-- 树扩展之字典树

一、字典树 1、字典树介绍 字典树&#xff0c;也称为“前缀树”&#xff0c;是一种特殊的树状数据结构&#xff0c;对于解决字符串相关问题非常有效。典型 用于统计、排序、和保存大量字符串。所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a; 利用字符串的…

【Qt问题记录】使用QDebug类输出不带转义或双引号

问题 使用Qt进行编程时&#xff0c;需要借助输出信息验证编码的正确性。 默认情况下&#xff0c;如果输出的是字符串&#xff0c;qDebug() 会在字符串的两侧加上引号&#xff0c;有时还会转义。 如下所示&#xff1a; QString strInfo QStringLiteral("helloworld"…

[原创][R语言]股票分析实战:周级别涨幅趋势的相关性

[简介]常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、De…

网络安全Web学习记录———CTF---Web---SQL注入(GET和POST传参)例题

小白初见&#xff0c;若有问题&#xff0c;希望各位大哥多多指正~ 我的第一道web类CTF题——一起来撸猫o(•ェ•)m-CSDN博客 最开始学习CTF里的web方向时&#xff0c;每次做了题遇到类似的老是忘记之前的解法&#xff0c;所以写点东西记录一下。听大哥的话&#xff0c;就从最…

架构设计系列之常见架构(二)

五、DDD&#xff08;领域驱动设计&#xff09; 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一种开发思想&#xff0c;强调将软件系统的注意力集中在业务领域上&#xff0c;将领域视为应用的核心。在架构设计中&#xff0c;DDD 提供了一种不同…

cgal教程 3D Alpha Wrapping

文章目录 3D Alpha Wrapping (3D alpha 包裹)1 介绍2 方法2.1 算法2.2 保证 3 接口4 选择参数4.1 alpha4.2 Offset4.3 关于“双面”包裹的注意事项 5 性能6 例子 3D Alpha Wrapping (3D alpha 包裹) 原文地址: https://doc.cgal.org/latest/Alpha_wrap_3/index.html#Chapter_3D…

Linux unzip解压多个文件

前情介绍 最近下载了imagenet1k数据集&#xff0c;令人难受的是这里边有很多的zip包&#xff0c;我总不能一个一个解压吧&#xff0c;这就太费时了&#xff0c;有点程序员思维很重要&#xff1a;批量解压。 解决办法 假设当前目录下有多个zip文件 需要 unzip *.zip …

【FunASR】Paraformer语音识别-中文-通用-16k-离线-large-onnx

模型亮点 模型文件: damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorchParaformer-large长音频模型集成VAD、ASR、标点与时间戳功能&#xff0c;可直接对时长为数小时音频进行识别&#xff0c;并输出带标点文字与时间戳&#xff1a; ASR模型…

apt-mark工具介绍(标记或取消标记软件包,防止特定软件包被自动更新或删除)

文章目录 apt-mark工具深度解析1. apt-mark概述1.1 apt-mark定义1.2 apt-mark作用 2. apt-mark常用命令2.1 标记软件包为手动安装2.2 标记软件包为自动安装2.3 阻止软件包更新2.4 允许软件包更新 3. 疑难技术点解析3.1 如何查看软件包的标记状态3.2 如何解决软件包依赖性问题 4…

IDEA新建jdk8 spring boot项目

今天新建spring boot项目发现JDK版本最低可选17。 但是目前用的最多的还是JDK8啊。 解决办法 Server URL中设置&#xff1a; https://start.aliyun.com/设置完成后&#xff0c;又可以愉快的用jdk8创建项目了。 参考 https://blog.csdn.net/imbzz/article/details/13469117…