用23种设计模式打造一个cocos creator的游戏框架----(十八)责任链模式
2023-12-16 23:14:39
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);
// 输出
// 释放中技能
文章来源:https://blog.csdn.net/u010192444/article/details/135036958
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!