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

1、模式标准

模式名称:组合模式

模式分类:结构型

模式意图:将对象组合成树型结构以表示“部分-整体”的层次结构。Composite 使得用户对单个对象和组合对象的使用具有一致性。

结构图:

适用于:

1、想表示对象的部分-整体层次结构。
2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

2、分析与设计

组合模式可以与命令模式结合使用,实现单命令,命令组,命令组内套命令组的功能。这样多一些常用的命令组,只需一个命令表达式就搞定了。

意图:将对象(命令)组合成树型结构以表示“部分-整体”的层次结构。

3、开始打造

命令类接口

// 命令类接口
export interface ICommand {execute(): void;
}

命令组

// 命令组
export class GroupCommand implements ICommand {private name: string;private commands: ICommand[] = [];constructor(name: string) {this.name = name;}add(command: ICommand): void {this.commands.push(command);}remove(command: ICommand): void {const index = this.commands.indexOf(command);if (index !== -1) {this.commands.splice(index, 1);}}getChild(index: number): ICommand {return this.commands[index]}execute(): void {console.log(`Executing command group: ${this.name}`);// 执行所有子命令for (const command of this.commands) {command.execute();}}
}

 单命令

// 具体技能命令类 - 小技能
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、开始使用

修改上次用过的解析器模式的上下文,新增commandId == 'attackgroup'

// 单位 操作命令 另一个单位
export class UnitCommandUnitContext {command: ICommand = nullfromUnitItem: UnitItem<any> = nulltoUnitItem: UnitItem<any> = nullgetUnitItem(unitItemId: string) {return xhgame.game.battleEntity.model.unitItemMap.get(unitItemId)}getCommand(commandId: string) {if (commandId == 'attackgroup') {const command1 = new SmallSkillCommand();const command2 = new MediumSkillCommand();const command3 = new LargeSkillCommand();// 先生成一个子命令组const commandGroup1 = new GroupCommand("commandGroup1");commandGroup1.add(command1);commandGroup1.add(command2);// 再生成一个含子命令组及多个单命令的命令组const commandGroup2 = new GroupCommand("commandGroup2");commandGroup2.add(commandGroup1);commandGroup2.add(command1);commandGroup2.add(command2);commandGroup2.add(command3);return commandGroup2}return new AttackCommand(null, null)}setCommand(command: ICommand) {this.command = command}setUnitItem(unitItem: UnitItem<any>) {if (this.fromUnitItem == null) {this.fromUnitItem = unitItem}if (this.toUnitItem == null) {this.toUnitItem = unitItem}}executeCommand() {if (this.command instanceof AttackCommand) {this.command.setUnitItem(this.fromUnitItem)this.command.setTargetUnitItem(this.toUnitItem)this.command.execute()} else {this.command.execute()}}
}

修改表达式

......
// 修改表达式,现在一个表达式,实际干了n多个命令
const commandText = "[[UnitItem.20]]{{attackgroup}}[[UnitItem.21]]";......

效果

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

龙芯loongarch64服务器编译安装gcc-8.3.0

前言 当前电脑的gcc版本为8.3.0,但是在编译其他依赖包的时候,出现各种奇怪的问题,会莫名其妙的中断编译。本地文章讲解如何自编译安装gcc,替换系统自带的gcc。 环境准备 下载页面:龙芯开源社区网站 - LoongArch GCC 8.3 交叉工具链 - 源码下载源码包名称如:loongson-gnu…

CSharp中Blazor初体验

Blazor 是一个由微软开发的开源 Web 框架&#xff0c;用于构建富客户端 Web 应用程序使用 C# 语言和 .NET 平台。Blazor 允许开发人员使用 C# 语言来编写前端 Web 应用程序&#xff0c;而不需要像传统的 JavaScript 框架&#xff08;如 Angular、React 或 Vue.js&#xff09;那…

MySQL,等值联结、内部联结、多表连接、自联结、自然联结、外部联结、带聚集函数的联结

1、表模型&#xff08;概略&#xff09; 2、联结表 使用一条select语句&#xff0c;检索出存储在多张表的数据。 2.1、等值联结 SELECT A.vend_id,A.vend_name,B.* FROM vendors as A,products as B # 规定要联结的表 WHERE A.vend_idB.vend_id; # 如何产生联结 2.1、内…

【数据结构】二叉树的模拟实现

前言:前面我们学习了堆的模拟实现&#xff0c;今天我们来进一步学习二叉树&#xff0c;当然了内容肯定是越来越难的&#xff0c;各位我们一起努力&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &…

6 最大积水量

蛮力求解 #include <iostream> using namespace::std; using std::cout; using std::cin; int zdjsl(int n, int height[]) {int sum 0;int left_max[n];int right_max[n];left_max[0] height[0];right_max[n-1] height[n-1];for(int i1; i<n; i){left_max[i] m…

IDEA shorten command line介绍和JAR manifest 导致mybatis找不到接口类处理

如果类路径太长&#xff0c;或者有许多VM参数&#xff0c;程序就无法启动。原因是大多数操作系统都有命令行长度限制。在这种情况下&#xff0c;IntelliJIDEA将试图缩短类路径。最好选中 classpath file模式。 shorten command line 选项提供三种选项缩短类路径。 none&#x…

IDEA出现闪退或打不开的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法4. 补充1. 问题所示 打开IDEA的时候过一会便闪退,可以再IDEA的右下角看到如下提示 (如果没有该提示,软件右下角也会有个红色感叹号,点开查看原因即可) 点开details方便排查闪退的具体原因: There is insufficient memory for the…

【Lidar】Open3D点云DBSCAN聚类算法:基于密度的点云聚类(单木分割)附Python代码

1 DBSCAN算法介绍 DBSCAN聚类算法是一种基于密度的聚类算法&#xff0c;全称为“基于密度的带有噪声的空间聚类应用”&#xff0c;英文名称为Density-Based Spatial Clustering of Applications with Noise。 DBSCAN聚类算法能够发现任意形状的类别&#xff0c;并且对噪音数据具…

第二百一十五回 如何创建单例模式

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容&#xff0c;本章回中将介绍 如何创建单例模式.闲话休提&#xff0c;让我们一起Talk Flutter吧。 …

初学gitrepo的种种

经过各种折腾之后&#xff0c;发现git其实还是很简单的&#xff1b; 首先你需要两台机器&#xff0c;一台作为服务器&#xff0c;一台作为开发机器&#xff0c;开发机器从服务器上拉取代码。 目 目录 git建仓 开发机器拉取代码 初始化仓代码 repo管理 repo工具的下载 …

晶体管的工作状态判断和工作条件

晶体管是模拟电路中基础的器件&#xff0c;对于电子工程师来说&#xff0c;了解晶体管工作的条件和判断晶体管的工作状态都是非常基础的&#xff0c;本文将带大家一起学习或回顾一下。 一、晶体管工作的条件 1.集电极电阻Rc&#xff1a; 在共发射极电压放大器中&#xff0c;…

Re解析(正则表达式解析)

正则表达式基础 元字符 B站教学视频&#xff1a; 正则表达式元字符基本使用 量词 贪婪匹配和惰性匹配 惰性匹配如下两张图&#xff0c;而 .* 就表示贪婪匹配&#xff0c;即尽可能多的匹配到符合的字符串&#xff0c;如果使用贪婪匹配&#xff0c;那么结果就是图中的情况三 p…