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

news/2024/5/19 13:01:33 标签: 设计模式, 游戏, 责任链模式

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);
// 输出
// 释放中技能


http://www.niftyadmin.cn/n/5267897.html

相关文章

【C语言】操作符详解(五)

目录 操作符的属性&#xff1a;优先级&#xff0c;结合性 优先级 结合性 表达式求值 整形提升 算术转换 问题表达式解析 表达式1 表达式2 表达式3 总结 操作符的属性&#xff1a;优先级&#xff0c;结合性 优先级 ⭐优先级&#xff1a;优先级指的是&#xff0c;如果一…

uniapp----button按钮去除边框

使用button标签&#xff0c;给其添加outline: none;border:none;无效果&#xff0c;去除边框&#xff0c;使用伪类进行处理。 button::after{ border: none;}

【Unity编辑器】使用AssetDatabase创建、删、改、加载资源

AssetDatabase是Unity编辑器环境下的一种API&#xff0c;主要用于在代码中对项目中的资源进行管理和操作。注意&#xff1a;AssetDatabase的这些方法只能在Unity编辑器环境下运行&#xff0c;不能在构建后的游戏中使用。在游戏运行时&#xff0c;你需要使用其他资源加载方法&am…

c# 利用ContainsKey方法判断Dictionary中是否包含某个键

.NET Framework : 4.7.2IDE : Visual Studio Community 2022OS : Windows 10 x64typesetting : Markdownblog : niaoge.blog.csdn.net ContainsKey的定义 命名空间: System.Collections.Generic 程序集: System.Collections.dll 原型 public bool ContainsKey (TKey key); 确…

MySQL 的索引分类

文章目录 MySQL 的索引分类是什么&#xff1f;单列索引组合索引&#xff1a;全文索引&#xff1a;空间索引&#xff1a; MySQL 的索引分类是什么&#xff1f; 单列索引 普通索引&#xff1a;MySQL 中基本索引类型&#xff0c;没有什么限制&#xff0c;允许在定义索引的列中插…

《小聪明》

目录 一、简言 一、python方面 1.1、字符串前补0 1.2、python安装包镜像网站 1.3、pip无法卸载包时 1.4、dataframe设置全行或全列显示 1.5、dataframe对某一列特征编码 1. 6、dataframe任意位置插入一列值 1.7、sklearn算法&#xff0c;输出特征方程 1.8、解决dataframe写入…

C++相关闲碎记录(16)

1、正则表达式 &#xff08;1&#xff09;regex的匹配和查找接口 #include <regex> #include <iostream> using namespace std;void out (bool b) {cout << ( b ? "found" : "not found") << endl; }int main() {// find XML/H…

【vue】正则表达式限制input的输入:

文章目录 1、只能输入大小写字母、数字、下划线&#xff1a;/[^\w_]/g2、只能输入小写字母、数字、下划线&#xff1a;/[^a-z0-9_]/g3、只能输入数字和点&#xff1a;/[^\d.]/g4、只能输入小写字母、数字、下划线&#xff1a;/[^\u4e00-\u9fa5]/g5、只能输入数字&#xff1a;/\…