用23种设计模式打造一个cocos creator的游戏框架----(十八)责任链模式

1、模式标准

模式名称:责任链模式

模式分类:行为型

模式意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

结构图:

适用于:

1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2、想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
3、可处理一个请求的对象集合应被动态指定 

2、分析与设计

前面我们了解了命令模式,命令是谁发出的呢,这里引出的责任链模式,巧好可以用上。将一次请技能释放求通过一串责任(命令)链接起来,不同责任(命令)做出不同的技能释放命令。我们假设场上有5个敌对单位时,ai单位释放小技能;有小于10个大于5个敌对单位时,ai单位释放中技能,有10个以上敌对单位时,ai单位释放大技能。

意图:使多个对象(命令)都有机会处理(技能释放)请求,从而避免(技能释放)请求的发送者和接收者之间的耦合关系。将这些对象(命令)连成一条链,并沿着这条链传递该(技能释放)请求,直到有一个对象(命令)处理它为止。

3、开始打造

技能触发基类


export interface ITrigger {
    nextTrigger: ITrigger
    command: ICommand
    setNextTrigger(trigger: ITrigger): void
    entryTrigger(param: any): void
    canTrigger(param: any): boolean
}


export abstract class SkillTrigger implements ITrigger {
    nextTrigger: ITrigger
    command: ICommand
    setNextTrigger(trigger: ITrigger): void {
        this.nextTrigger = trigger;
    }
    setCommand(command: ICommand): void {
        this.command = command;
    }
    entryTrigger(skillTriggerRequest: ISkillTriggerRequest): void {
        console.log('entryTrigger', skillTriggerRequest, this)
        if (this.canTrigger(skillTriggerRequest)) {
            if (this.command) {
                this.command.execute();
            }
        } else if (this.nextTrigger) {
            this.nextTrigger.entryTrigger(skillTriggerRequest);
        } else {
            console.log("无其他触发器");
        }
    }
    abstract canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean;
}

 小技能,中技能,大技能

// 小技能触发器
export class SmallSkillTrigger extends SkillTrigger {
    canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean {
        return skillTriggerRequest.enemyCount < 5; // 敌对单位数量小于5时释放小技能
    }
}

// 中技能触发器
export class MediumSkillTrigger extends SkillTrigger {
    canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean {
        return skillTriggerRequest.enemyCount >= 5 && skillTriggerRequest.enemyCount < 10; // 敌对单位数量在5到10之间时释放中技能
    }
}

// 大技能触发器
export class LargeSkillTrigger extends SkillTrigger {
    canTrigger(skillTriggerRequest: ISkillTriggerRequest): boolean {
        return skillTriggerRequest.enemyCount >= 10; // 敌对单位数量大于等于10时释放大技能
    }
}

技能命令

// 具体技能命令类 - 小技能
export class SmallSkillCommand implements ICommand {
    execute(): void {
        console.log("释放小技能");
    }
}

// 具体技能命令类 - 中技能
export class MediumSkillCommand implements ICommand {
    execute(): void {
        console.log("释放中技能");
    }
}

// 具体技能命令类 - 大技能
export class LargeSkillCommand implements ICommand {
    execute(): void {
        console.log("释放大技能");
    }
}

4、开始使用

// 创建责任链
const smallSkillTrigger = new SmallSkillTrigger();
const mediumSkillTrigger = new MediumSkillTrigger();
const largeSkillTrigger = new LargeSkillTrigger();

// 创建命令
const smallSkillCommand = new SmallSkillCommand();
const mediumSkillCommand = new MediumSkillCommand();
const largeSkillCommand = new LargeSkillCommand();

// 设置触发器的命令
smallSkillTrigger.setCommand(smallSkillCommand);
mediumSkillTrigger.setCommand(mediumSkillCommand);
largeSkillTrigger.setCommand(largeSkillCommand);

smallSkillTrigger.setNextTrigger(mediumSkillTrigger);
mediumSkillTrigger.setNextTrigger(largeSkillTrigger);

let param = {
    enemyCount: 8
}
smallSkillTrigger.entryTrigger(param);
// 输出
// 释放中技能

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

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

相关文章

MLX:苹果 专为统一内存架构(UMA) 设计的机器学习框架

“晨兴理荒秽&#xff0c;带月荷锄归” 夜深闻讯&#xff0c;有点兴奋&#xff5e; 苹果为 UMA 设计的深度学习框架真的来了 统一内存架构 得益于 CPU 与 GPU 内存的共享&#xff0c;同时与 MacOS 和 M 芯片 交相辉映&#xff0c;在效率上&#xff0c;实现对其他框架的降维打…

Redis设计与实现之压缩列表

目录 一、 压缩列表 1、ziplist的构成 2、节点的构成 pre_entry_length encoding 和 length content 3、创建新 ziplist 4、将节点添加到末端 5、将节点添加到某个/某些节点的前面 6、删除节点 7、遍历 8、查找元素、根据值定位节点 二、小结 一、 压缩列表 Zipli…

论文降重同义词替换的实践经验与改进建议 快码论文

大家好&#xff0c;今天来聊聊论文降重同义词替换的实践经验与改进建议&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文降重同义词替换的实践经验与改…

TS类型体操-简单-实现pick

文章目录 问题描述举例实现 问题描述 不使用 Pick<T, K> &#xff0c;实现 TS 内置的 Pick<T, K> 的功能。 从类型T 中选出符合 K 的属性&#xff0c;构造一个新的类型。 举例 interface Todo {title: stringdescription: stringcompleted: boolean }type TodoPre…

挖矿木马应急响应-案例分析

挖矿木马应急响应-案例分析 linux 终端无法使用系统资源使用异常高 首先解决linux命令无法使用的问题&#xff0c;显示libc.so.6 没有重新连接一下libc文件 查看日志 发现木马运行成功后就日志一直报libc错误 根据信息向上插在日志 向上发现&#xff0c;root用户被爆破后…

【Spring教程30】Spring框架实战:从零开始学习SpringMVC 之 Rest风格简介与RESTful入门案例

目录 1 REST简介2 RESTful入门案例2.1 环境准备2.2 思路分析2.3 修改RESTful风格 3 知识点总结 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安…

windows 10 安装和配置nginx

1 下载nginx 1.1 下载地址&#xff1a;http://nginx.org/en/download.html 1.2 使用解压到安装目录 1.3 更改配置 conf目录下nginx.conf 修改为未被占用的端口&#xff0c;地址改成你的地址 server {listen 9999;server_name localhost;#charset koi8-r;#access_lo…

SQL进阶理论篇(八):SQL查询的IO成本

文章目录 简介数据库缓冲池查看缓冲池的大小数据页加载的三种方式通过 last_query_cost 统计 SQL 语句的查询成本总结参考文献 简介 本节将介绍磁盘IO是如何加载数据的&#xff0c;重点介绍一下数据库缓冲池的概念。主要包括&#xff1a; 什么是数据库缓冲池&#xff0c;它在…

云架构俭约之道七法则(The Frugal Architect)

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 一、前言关于 Law 与 Rule 的区别 二、云架构俭约之道七法…

【算法刷题】每日打卡——动态规划(1)

背包问题 例题一 有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数…

深度学习python编译器的配置及法宝函数的作用

一、python编辑器的配置&#xff08;pycharm 和 jupyter&#xff09; &#xff08;1&#xff09;pycharm 在pycharm导入conda环境&#xff1a; 新建项目&#xff0c;更改编译器&#xff0c;选择已有的编译器 选择python.exe时会出现错误&#xff1a;找不到conda可执行文件 …

太空旅行:计算机技术的崭新航程

太空旅行&#xff1a;计算机技术的崭新航程 一、引言 自古以来&#xff0c;人类就对浩渺的宇宙充满了无尽的好奇和渴望。随着科技的飞速发展&#xff0c;太空旅行已经从科幻小说中的构想变为现实。在这个过程中&#xff0c;计算机技术起到了不可或缺的作用。从阿波罗时代的初…

EDT:On Efficient Transformer-Based Image Pre-training for Low-Level Vision

EDT&#xff1a;On Efficient Transformer-Based Image Pre-training for Low-Level Vision 论文地址&#xff1a;On Efficient Transformer-Based Image Pre-training for Low-Level Vision 代码地址&#xff1a;fenglinglwb/EDT: On Efficient Transformer-Based Image Pre…

知识付费小程序开发:技术实践示例

随着知识付费小程序的兴起&#xff0c;让我们一起来看一个简单的示例&#xff0c;使用Node.js和Express框架搭建一个基础的知识付费小程序后端。 首先&#xff0c;确保你已经安装了Node.js和npm。接下来&#xff0c;创建一个新的项目文件夹&#xff0c;然后通过以下步骤创建你…

LabVIEW实时建模检测癌细胞的异常

LabVIEW实时建模检测癌细胞的异常 癌症是全球健康的主要挑战之一&#xff0c;每年导致许多人死亡。世界卫生组织指出&#xff0c;不健康的生活方式和日益严重的环境污染是癌症发生的主要原因之一。癌症的发生通常与基因突变有关&#xff0c;这些突变导致细胞失去正常的增长和分…

excel手撕神经网络(只需高中数学基础)

神经网络最基础部分是由神经元组成&#xff0c;一个神经元相当于是一个一次函数&#xff0c;yaxb 即在已知x&#xff0c;和y情况下&#xff0c;怎么使用神经网络求解a和b 如下是使用excel求解的神经网络&#xff0c;可以方便理解神经网络运行原理 excel玩具神经网络下载地址 百…

蓝桥杯专题-真题版含答案-【排序法 - 改良的选择排序】【插补搜寻法】【稀疏矩阵】【欧拉与鸡蛋】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

centos8stream 升级 sqlite3 ,解决 SQLite 3.27 or later is required (found 3.26.0).

服务器环境是centos8stream, 默认的sqlite是 3.26 &#xff0c;因此&#xff0c;需要升级。 sqlite官网&#xff1a;SQLite Download Page 1.从官网下载最新源码包 cd /opt/ wget https://www.sqlite.org/2023/sqlite-autoconf-3440200.tar.gz tar xvf sqlite-autoconf-344020…

【webstrom】【idea】修改git历史提交记录

webstrom修改git历史提交记录 历史记录中有3条提交记录 此时2中的提交记录需要更新&#xff0c;我们可以在2中右击&#xff0c;选择“从这里执行交互式变基” 在弹框中选择需要修改提交记录2右击&#xff0c;然后选择“停止以编辑” 启动变基 更改2中内容 提交对2的更改 …

机器学习 高维数据可视化:t-SNE 降维算法

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…