用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.8
    visitHeroUnitItem(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.8
    visitHeroUnitItem(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: TCSGame
    game: 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.ad
        let attackVisitor = xhgame.attackVisitor.getFlyweight('monomer')
        // let attackVisitor = new MonomerAttackVisitor(damage)
        unitItem.accept(attackVisitor, damage) // 伤害作为外部参数传入
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能改变医疗保健:人工智能如何革命医学

人工智能&#xff08;Artificial Intelligence, 简称AI&#xff09;的快速发展正逐渐改变着我们的生活方式和社会结构。在医疗保健领域&#xff0c;AI的应用不仅提供了更准确、高效的诊断和治疗手段&#xff0c;还为医生和患者之间的交流提供了新的途径。本文将探讨人工智能如何…

java springboot+jsoup写一段爬虫脚本 将指定地址的 图片链接 文本 超链接地址存入自己的属性类对象中

首先 还是最基本的 要在 pom.xml 引入依赖 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.1</version> </dependency>然后 我们可以在项目中创建一个属性类 我这里就叫 WebContent了…

到底什么是DevOps

DevOps不是一组工具&#xff0c;也不是一个特定的岗位。在我看来DevOps更像是一种软件开发文化&#xff0c;一种实现快速交付能力的手段。 DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理&#xff0c;从而更快、更频繁地交付更稳定的…

微信这个地方,收费了

大家好&#xff0c;我是小悟 我们都知道&#xff0c;微信企业类型小程序需要认证&#xff0c;现在微信个人小程序也需要认证了&#xff0c;账号逾期未完成微信认证&#xff0c;将影响账号“被搜索”能力。 这一要求&#xff0c;在很多人看来可能是一项不必要的规定。然而&…

数据结构之---- 图

数据结构之---- 图 什么是图&#xff1f; 图是一种非线性数据结构&#xff0c;由顶点和边组成。我们可以将图 &#x1d43a; 抽象地表示为一组顶点 &#x1d449; 和一组边 &#x1d438; 的集合。 以下示例展示了一个包含 5 个顶点和 7 条边的图。 如果将顶点看作节点&…

【全面解读】洁净室验收及检测设备、方法全介绍

洁净室相关概念 洁净室又可称作无尘室&#xff08;Cleanroom&#xff09;&#xff0c;通常用作专业工业生产或科学研究的一部分&#xff0c;包括制造药品&#xff0c;集成电路&#xff0c;CRT&#xff0c;LCD&#xff0c;OLED和microLED显示器等。洁净室的设计是为了保持极低水…

数据结构之---- 堆、建堆操作、Top‑K 问题

数据结构之---- 堆、建堆操作、Top‑K 问题 什么是堆&#xff1f; 堆是一种满足特定条件的完全二叉树 主要可分为两种类型&#xff1a; 大顶堆&#xff1a;任意节点的值 ≥ 其子节点的值。小顶堆&#xff1a;任意节点的值 ≤ 其子节点的值。 堆作为完全二叉树的一个特例&am…

闲人闲谈PS之四十八——非标定制企业BOM传输问题

惯例闲话&#xff1a;上个月&#xff0c;集团公司组织了一次信息化大会&#xff0c;邀请国内外10几位知名的院士嘉宾来助阵。能听这些站在知识顶端的大佬的讲座&#xff0c;受益匪浅。至少在当下数字化趋势之下&#xff0c;细分领域的发展势头&#xff0c;有了方向性的指点。很…

C++怎么快速提升实力?

C怎么快速提升实力&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

什么是持续测试?为什么要持续测试?

测试是软件开发生命周期 (SDLC) 的重要组成部分。SDLC 的每个阶段都应包含测试&#xff0c;以获得更快的反馈并提高产品质量。 我们来聊聊持续测相关话题&#xff0c;如何从持续测试中获得更大的收益。 何谓持续测试 持续测试有助于在软件开发生命周期 (SDLC) 的所有阶段提供…

本地连锁门店经营可以借助系统实现哪些功能?

不少的连锁门店目前还是很基础的ERPPOS收银&#xff0c;其他的还是走传统的手工管理&#xff0c;大多连锁老板知道借助信息化系统可以帮助门店实现精细化管理&#xff0c;提高运营效率&#xff0c;降低成本&#xff0c;增强竞争力&#xff0c;但不知道怎么去做&#xff0c;能做…

快速搭建知识付费平台?我有才,为你提供一站式解决方案

在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和维护一个属于自己的知识付费平台需要…

《Java 已死、前端已凉》 我的评价是:中肯的

《Java 已死、前端已凉》 我的评价是&#xff1a;中肯的 如题所述 此次包含了前端、后端开发 以下为论述&#xff1a; 文章目录 前端后端当前环境附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什么是大端和小端数据传输中的大…

vscode 文件目录栏缩进

一个好的开发IDE&#xff0c;一定是让人赏心悦目的&#xff0c;这个赏心悦目也一定是包含层级目录的清晰明了&#xff01;不能像感冒的鼻涕一样一擤一摊子&#xff01;就像。。。。嗯&#xff0c;算了&#xff0c;断子还是不讲了&#xff0c;怕有些妹子投诉 或发消息批评我。。…

c++原子变量

原子变量 概述 ​ C11提供了一个原子类型std::atomic<T>&#xff0c;通过这个原子类型管理的内部变量就可以称之为原子变量&#xff0c;我们可以给原子类型指定bool、char、int、long、指针等类型作为模板参数&#xff08;不支持浮点类型和复合类型&#xff09;。 ​ …

如何用gpt改写文章 (1) 神码ai

大家好&#xff0c;今天来聊聊如何用gpt改写文章 (1)&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 如何用GPT改写文章 一、引言 随着人工智能技术的飞速发展&#xff0c;自然语言处理领域取得了重大突…

【一步到位】汽车过户全攻略:轻松搞定,告别繁琐流程

校长车行是一家昆明二手车代办公司&#xff0c;今天我们要聊一聊一个让很多人头疼的问题——汽车过户。相信很多朋友在购买二手车或者需要将车辆转让给他人时&#xff0c;都会遇到这个繁琐的流程。那么&#xff0c;如何才能轻松搞定汽车过户呢&#xff1f;接下来&#xff0c;就…

充电桩定期检测的必要性

充电桩是电动车充电的重要设备&#xff0c;其安全性直接关系到用户的生命财产安全。定期检测可以确保充电桩的正常运行&#xff0c;及时发现并修复潜在的安全隐患&#xff0c;提高充电桩的可靠性和安全性。 充电桩作为一个外部设备&#xff0c;长期暴露在室外环境中&#xff0c…

【cocotb】【达坦科技DatenLord】Cocotb Workshop分享

https://www.bilibili.com/video/BV19e4y1k7EE/?spm_id_from333.337.search-card.all.click&vd_sourcefd0f4be6d0a5aaa0a79d89604df3154a 方便RFM实现 cocotb_test 替代makefile &#xff0c; 类似python 函数执行

快宝技术:连接无代码开发,API集成提升电商营销和用户运营效率

无代码开发&#xff1a;创新的启航 快宝技术自2012年成立至今&#xff0c;一直是无代码开发领域的佼佼者。通过无代码开发平台&#xff0c;快宝技术旨在降低技术门槛&#xff0c;并使非技术人员能够轻松创建和部署应用程序。这不仅使得快递末端软件开发变得高效和便捷&#xf…