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

1、模式标准

模式名称:策略模式

模式分类:行为型

模式意图:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化

结构图:

适用于:

1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
2、需要使用一个算法的不同变体。例如,定义一些反映不同空间的空间/时间权衡的算法当这些变体实现为一个算法的类层次时,可以使用策略模式。
3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4、一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的 Strategy 类中,以代替这些条件语句。 

2、分析与设计  

策略和桥接模式看起来可能非常相似,但策略模式是行为型,桥接模式是结构型。策略模式是直接引用实现类,而桥接模式是引用一个实现类的接口。当前策略模式关键是可以相互替换算法。接下来把我们曾经用过的武器替换来举例,修改一下我们的意图

意图:定义一系列的算法(武器),把它们一个个封装起来,并且使它们可以相互替换。

3、开始打造

// 武器接口
export interface IWeapon {useWeapon(): void;
}// 剑
export class Sword implements IWeapon {useWeapon(): void {console.log("用剑进行攻击");}
}// 斧头
export class Axe implements IWeapon {useWeapon(): void {console.log("用斧头进行攻击");}
}
// 弓
export class Bow implements IWeapon {useWeapon(): void {console.log("用弓箭进行攻击");}
}
// 近程攻击
export class MeleeAttack implements IAttackStrategy {attack(weapon: IWeapon): void {console.log("进行近程攻击:");weapon.useWeapon();}
}

【优化】结合前面的桥接模式的攻击方式,我们将攻击系统升级一下

// 攻击方式接口
export interface IAttackStrategy {attack(weapon: IWeapon): void;
}// 近程攻击
export class MeleeAttack implements IAttackStrategy {attack(weapon: IWeapon): void {console.log("进行近程攻击:");weapon.useWeapon();}
}// 远程攻击
export class RangedAttack implements IAttackStrategy {attack(weapon: IWeapon): void {console.log("进行远程攻击:");weapon.useWeapon();}
}// 武器接口
export interface IWeapon {useWeapon(): void;
}// 剑
export class Sword implements IWeapon {useWeapon(): void {console.log("用剑进行攻击");}
}// 斧头
export class Axe implements IWeapon {useWeapon(): void {console.log("用斧头进行攻击");}
}
// 弓
export class Bow implements IWeapon {useWeapon(): void {console.log("用弓箭进行攻击");}
}// 抽象战斗者
export abstract class Fighter {protected attackStrategy: IAttackStrategy;protected weapon: IWeapon;constructor(attackStrategy: IAttackStrategy, weapon: IWeapon) {this.attackStrategy = attackStrategy;this.weapon = weapon;}attack(): void {this.attackStrategy.attack(this.weapon);}// 更换武器的方法setWeapon(weapon: IWeapon): void {this.weapon = weapon;}
}// 骑兵
export class Cavalry extends Fighter {constructor(attackStrategy: IAttackStrategy, weapon: IWeapon) {super(attackStrategy, weapon);}
}// 弓箭手
export class Archer extends Fighter {constructor(attackStrategy: IAttackStrategy, weapon: IWeapon) {super(attackStrategy, weapon);}
}

 4、开始使用

export class UnitItem  extends Component implements IItem, IUnitItem {ad: number = 100;mp: number = 0;role: Fighter;private currentState: IUnitState = null;accept(visitor: IAttackVisitor) {visitor.visitUnitItem(this)}setRole(role: Fighter): void {this.role = role;}setWeapon(weapon: IWeapon) {this.role.setWeapon(weapon)}.....
}
        let unitItem001 = xhgame.itemFactory.createUnitItem('kuloubing', UnitType.UnitSpine)let unitItem002 = xhgame.itemFactory.createUnitItem('kuloubing', UnitType.UnitSpine)unitItem001.idle()unitItem002.idle()const sword = new Sword();const bow = new Bow();const axe = new Axe();unitItem001.setRole(new Cavalry(new MeleeAttack(), sword));console.log('unitItem001(骑兵-近程)使用【剑】对unitItem002发起了攻击')unitItem001.attack(unitItem002)// 更换骑兵的武器为斧头unitItem001.setWeapon(axe);console.log('unitItem001(骑兵-近程)使用【斧头】对unitItem002发起了攻击')unitItem001.attack(unitItem002);unitItem002.setRole(new Cavalry(new RangedAttack(), bow));console.log('unitItem002(骑兵-远程)使用【弓】对unitItem001发起了攻击')unitItem002.attack(unitItem001)

总结:桥接模式在构建时定好攻击方式,策略模式在行为中使用不同的武器。

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

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

相关文章

贝锐蒲公英解决方案:企业海外分部高效、稳定访问国内办公系统

某电气技术有限公司是一家专注数字电源研发、制造和销售的企业。公司致力于为大数据和新能源行业提供智慧能源解决方案, 数字电源产品在数据与算力中心、网络基础设施、电池储能换电、家庭能源系统中均有广泛应用。目前在国内以及东南亚、欧洲、美国等地设有分公司/办事处&…

STM32F407-14.3.18-01连接霍尔传感器

连接霍尔传感器 可通过用于生成电机驱动 PWM 信号的高级控制定时器(TIM1 或 TIM8)以及图 114 中称为 “接口定时器”的另一个定时器 TIMx(TIM2、TIM3、TIM4 或 TIM5),实现与霍尔传感器的连接。3 个定时器输入引脚&…

Android动画(四)——属性动画ValueAnimator的妙用

目录 介绍 效果图 代码实现 xml文件 介绍 ValueAnimator是ObjectAnimator的父类,它继承自Animator。ValueAnimaotor同样提供了ofInt、ofFloat、ofObject等静态方法,传入的参数是动画过程的开始值、中间值、结束值来构造动画对象。可以将ValueAnimator看…

LOF基金跟股票一样吗?

LOF基金,全称为"上市型开放式基金",是一种可以在上海证券交易所认购、申购、赎回及交易的开放式证券投资基金。投资者可以通过上海证券交易所场内证券经营机构或场外基金销售机构进行认购、申购和赎回基金份额。 LOF基金的特点是既可以像股票…

1852_bash中的find应用扩展

Grey 全部学习内容汇总: https://github.com/GreyZhang/toolbox 1852_bash中的find应用扩展 find这个工具我用了好多年了,但是是不是真的会用呢?其实不然,否则也不会出现这种总结式的笔记。其实,注意部分小细节之后…

爬虫练习-获取imooc课程目录

代码: from bs4 import BeautifulSoup import requests headers{ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0, }id371 #课程id htmlrequests.get(https://coding.imooc.com/class/chapter/id.html#Anchor,head…

Netty网络基础的通俗理解(网络操作系统)

写在前面 说来惭愧,最近半年没怎么学习技术,时间基本都花在工作以及去熟悉了解金融领域的知识去了。从大一到现在,我一直有个持续学习技术的习惯,如果太久没学习技术,我心里就开始有点焦虑或者说不充实,所…

单元测试计划、用例、报告、评审编制模板

单元测试支撑文档编制模板,具体文档如下: 1. 单元测试计划 2. 单元测试用例 3. 单元测试报告 4. 编码及测试评审报告 软件项目相关资料全套获取:软件项目开发全套文档下载-CSDN博客 1、单元测试计划 2、单元测试用例 3、单元测试报告 4、编码…

【电路笔记】-电容器特性

电容器特性 文章目录 电容器特性1、概述2、标称电容 (C)3、工作电压(WV)4、公差(%)5、漏电流6、工作温度(T)7、温度系数(TC)8、极化9、等效串联电阻 (ESR) 电容器的特性决定了其温度…

[C++] 多态(上) -- 抽象类、虚函数、虚函数表

文章目录 1、多态的概念2、多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同) 2.4.2 析构函数的重写(基类与派生类析在这里插入图片描述2.4.3 选择题测试 2.5 C11 final 和 override2.5.1 f…

xilinx原语介绍及仿真——ODELAYE2

7系列IO模块相关的结构如图1所示,前文对IOB、IDELAYE2、ILOGIC、OLOGIC进行了讲解,还剩下ISERDESE2、OSERDESE2、ODELAYE2原语,本文对ODELAYE2进行讲解,该原语只有HP bank才有,即7系列FPGA的A7系列没有ODELAYE2结构&am…

计算机网络:数据链路层(网桥)

带你速通计算机网络期末 目录 一、冲突域和广播域 二、网桥介绍 三、网桥分类—―透明网桥 四、网桥分类―—源路由网桥 五、多接口网桥―—以太网交换机 总结 一、冲突域和广播域 冲突域:在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只…