用23种设计模式打造一个cocos creator的游戏框架----(十六)亨元模式

1、模式标准

模式名称:亨元模式

模式分类:结构型

模式意图:运用共享技术有效地支持大量细粒度的对象

结构图:

适用于:

1、一个应用程序使用了大量的对象.
2、完全由于使用大量的对象,造成很大的存储开销。
3、对象的大多数状态都可变为外部状态。
4、如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

5、应用程序不依赖于对象标识。由于 Flyweight 对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。 

2、分析与设计

亨元模式和对象池模式有点像,但是有差别,对象池模式在我们前面提到的抽象工厂中,有提到部分代码,对象池模式一般有回收这个动作,回收对象一般会通过reset方法进行重置。而亨元模式不涉及reset回收,它是对大量颗粒度对象的共享技术。

前面在访问者模式中,我们简单设计了一个伤害系统,但是每次创建伤害访问者时都需要new一个,比如一次单体普通攻击:new MonomerAttackVisitor(100),但伤害事件在游戏中是大量存在,每次都new一个肯定是不友好的。这就需要将伤害值作为外部状态从对象中剥离出来,然后通过亨元模式将相同对象的共享起来。

结合前面的攻击访问者,重新描述一下意图:

意图:运用共享技术有效地支持大量细粒度的(攻击访问者)对象

3、开始打造

攻击访问者

export interface IAttackVisitor {// 普通单位visitUnitItem(unitItem: IUnitItem, damage: number): void// 英雄单位visitHeroUnitItem(unitItem: IUnitItem, damage: number): void
}// 单体攻击
export class MonomerAttackVisitor implements IAttackVisitor {// 普通单位visitUnitItem(unitItem: IUnitItem, damage: number): void {console.log('普通单位扣减 hp=' + damage)unitItem.subHp(damage)}// 英雄单位,受到伤害值为0.8visitHeroUnitItem(unitItem: IUnitItem, damage: number): void {console.log('英雄单位扣减 hp=' + damage)unitItem.subHp(damage * 0.8)}
}// 群体攻击
export class GroupAttackVisitor implements IAttackVisitor {// 普通单位visitUnitItem(unitItem: IUnitItem, damage: number): void {unitItem.subHp(damage)// todo 周围单位也受到伤害}// 英雄单位,受到伤害值为0.8visitHeroUnitItem(unitItem: IUnitItem, damage: number): void {unitItem.subHp(damage * 0.8)// todo 周围单位也受到伤害}
}

 亨元工厂

// 亨元工厂
export class AttackVisitorFlyweightFactory {private flyweights: { [key: string]: IAttackVisitor } = {};public getFlyweight(key: string): IAttackVisitor {if (!this.flyweights[key]) {switch (key) {case 'monomer':this.flyweights[key] = new MonomerAttackVisitor();break;case 'group':this.flyweights[key] = new GroupAttackVisitor();break;// 添加其他 AttackVisitor 类型的处理逻辑default:throw new Error('Invalid AttackVisitor type');}}return this.flyweights[key];}
}

 4、开始使用 

将攻击访问者工厂加入到全局单例里面

export class SingletonInstance {// 设计模式5(单例模式)private static _instance: SingletonInstance = new this()static get instance(): SingletonInstance {return this._instance}static getInstance() {return this._instance}// game: TCSGamegame: JCQGame// game: DemoGame// game: FeijianGame.....// 攻击访问者工厂attackVisitor: AttackVisitorFlyweightFactory = new AttackVisitorFlyweightFactory()
}

通过外观模式加入到xhgame中 

export class xhgame {// 设计模式10(外观模式)....// 攻击访问者工厂static get attackVisitor() {return gameInstance.attackVisitor}
}

修改单位里面的attack方法 

export class UnitItem  extends Component implements IItem, IUnitItem {ad: number = 100;mp: number = 0;role: Fighter;private currentState: IUnitState = null;......accept(visitor: IAttackVisitor, damage: number) {visitor.visitUnitItem(this, damage)}attack(unitItem: UnitItem<T>) {if (!this.canAttack()) {// 不能处理攻击的逻辑,可能是显示消息或者进入其他状态return;}// 尝试进入攻击状态this.getCurrentState().attack()let damage = this.adlet attackVisitor = xhgame.attackVisitor.getFlyweight('monomer')// let attackVisitor = new MonomerAttackVisitor(damage)unitItem.accept(attackVisitor, damage) // 伤害作为外部参数传入}
}

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

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

相关文章

铭飞CMS list 接口 SQL注入漏洞复现

0x01 产品简介 铭飞CMS是一款基于java开发的一套轻量级开源内容管理系统,铭飞CMS简洁、安全、开源、免费,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,专注为公司企业、个人站长快速建站提供解决方案 0x02 漏洞概述 铭飞CMS在5.2.10版本以前list 接口处存在sql注入…

什么是CAS(比较并交换-乐观锁机制-锁自旋)

什么是 CAS&#xff08;比较并交换-乐观锁机制-锁自旋&#xff09; 概念及特性 CAS&#xff08;Compare And Swap/Set&#xff09;比较并交换&#xff0c;CAS 算法的过程是这样&#xff1a;它包含 3 个参数CAS(V,E,N)。V 表示要更新的变量(内存值)&#xff0c;E 表示预期值(旧…

嵌入式开发板qt gdb调试

1&#xff09; 启动 gdbserver ssh 或者 telnet 登陆扬创平板 192.168.0.253&#xff0c; 进入命令行执行如下&#xff1a; chmod 777 /home/HelloWorld &#xff08;2&#xff09; 打 开 QTcreator->Debug->StartDebugging->Attach to Running Debug Server 进行…

Nginx-nginx-1.18.0编译时默认包含哪些模块?nginx-1.18.0有哪些模块和配置语句,各有什么作用?

目录 01-如何查看 Nginx-nginx-1.18.0编译时默认包含哪些模块&#xff1f;02-如何查看Nginx有哪些自己可以手动设置添加或不添加的模块03-各配置语句和模块功能简介03-001&#xff1a;--pid-pathPATH03-002&#xff1a;--lock-pathPATH 03-003&#xff1a;select_module 03-004…

[湖湘杯 2021 final]MultistaeAgency

题目是给了源码&#xff0c;我们先来看web的main.go package mainimport ("bytes""crypto/md5""encoding/json""fmt""io""io/ioutil""log""math/rand""net/http""os"&q…

ASP.NET Core 8 在 Windows 上各种部署模型的性能测试

ASP.NET Core 8 在 Windows 上各种部署模型的性能测试 我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多。这些部署方案对性能的影响一直以来都是靠经验。比如如果是部署在 IIS 下&#xff0c;那么 In Process 会比 Out Process 快&#xff1b;如果是 Self Hos…

Linux 线程池源码剖析

1 了解线程池 1-1线程池的概述 由一个任务队列和一组处理队列的线程组成。一旦工作进程需要处理某个可能“阻塞”的操作,不用自己操作,将其作为一个任务放到线程池的队列,接着会被某个空闲线程提取处理。 1-2线程池的组件 任务 待处理的工作,通常由标识、上下文和处理…

Java_内部类枚举

内部类 内部类: 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块)&#xff0c;如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。场景:当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且这个事物没有必要单独设计时&#x…

年度评选揭晓:Apache SeaTunnel荣获年度优秀开源技术团队殊荣

在OSCHINA平台举办的2023年度开源技术团队评选中&#xff0c;Apache SeaTunnel社区凭借其在开源领域的出色表现&#xff0c;荣获“2023年度优秀开源技术团队”奖项。 这一殊荣不仅是对Apache SeaTunnel社区在过去一年中技术贡献的认可&#xff0c;也是对其在开源社区活动运营方…

聊聊Api接口优化的几个方法!

我负责的系统到2021年初完成了功能上的建设&#xff0c;开始进入到推广阶段。随着推广的逐步深入&#xff0c;收到了很多好评的同时也收到了很多对性能的吐槽。刚刚收到吐槽的时候&#xff0c;我们的心情是这样的&#xff1a; 当越来越多对性能的吐槽反馈到我们这里的时候&…

springboot mybatis手动事务

创建springboot项目 搭建最简单的SpringBoot项目-CSDN博客 引入mybatis和数据库依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><…

java设计模式学习之【代理模式】

文章目录 引言代理模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用图片加载示例代码地址 引言 在现实生活中&#xff0c;我们经常使用代理来处理我们不想直接参与或无法直接参与的事务&#xff0c;例如&#xff0c;使用律师来代表法庭上的案件。在软件开发…

JS实现日历表

有需要的可以用一下&#xff0c;这是一个简单的demo. HTML&#xff1a; <table><thead><tr><th colspan"2"><span class"left"></span></th><th colspan"3"><span class"time"&g…

【快速应用开发】看看RedwoodJS

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

vue3+vite4中使用svg,使用iconfont-svg图标

记录一下vue3中如何使用svg图标&#xff0c;vue2中大家常用iconfont字体图标&#xff0c;现在vue3大家都又推荐svg的方式使用图表&#xff0c;包括elementplus组件库也变成使用svg方式引用图标。 1、创建svg组件 components/IconSvg.vue <template><svg class"…

保障事务隔离级别的关键措施

目录 引言 1. 锁机制的应用 2. 多版本并发控制&#xff08;MVCC&#xff09;的实现 3. 事务日志的记录与恢复 4. 数据库引擎的实现策略 结论 引言 事务隔离级别是数据库管理系统&#xff08;DBMS&#xff09;中的一个关键概念&#xff0c;用于控制并发事务之间的可见性。…

爱名网被评为“最佳安全保障注册服务机构”

12月12日&#xff0c;由中国互联网络信息中心主办&#xff0c;中国科学院计算机网络信息中心、中国工业互联网研究院、中国互联网协会联合主办&#xff0c;人民邮电报社承办的第四届中国互联网基础资源大会&#xff08;CNIRC&#xff09;在北京举办。 在本届大会上&#xff0c…

网络镜像 -- 本地端口镜像

网络镜像 网络镜像技术允许复制和记录在计算机网络上传输的数据流量&#xff0c;可以将交换机中一个端口的流量复制到另一个端口。 网络镜像广泛用于抓包监控。 用一个场景来举例&#xff1a; 如图&#xff0c;PC1、2、3分别是三台主机&#xff0c;与Switch交换机对应端口…

Mac 如何删除文件及文件夹?可以尝试使用终端进行删除

MacOS 是 Mac 电脑采用的操作系统&#xff0c;你知道 Mac 如何删除文件吗&#xff1f;除了直接将文件或者文件夹拖入废纸篓之外&#xff0c;我们还可以采用终端命令的办法去删除文件&#xff0c;本文为大家总结了 Mac 删除文件方法。 为何使用命令行删除文件 在使用 Mac 电脑…

训练效率提升40倍!开源图片生3D模型,Stable Zero123来啦

12月14日&#xff0c;著名生成式AI开源平台Stability.ai在官网开源了&#xff0c;图片生成高质量3D模型——Stable Zero123。 Stable Zero123是基于今年3月&#xff0c;丰田研究院和哥伦比亚大学联合开源的Zero123模型开发而成。主要通过更改渲染数据集和分数蒸馏对模型进行了…