《游戏编程模式》学习笔记(十二)类型对象 Type Object

定义

定义类型对象类和有类型的对象类。每个类型对象实例代表一种不同的逻辑类型。 每种有类型的对象保存对描述它类型的类型对象的引用。

定义往往不是人能看懂的,我们需要例子才能够理解。

举例

假设你要为一款游戏制作一些怪物敌人。这些敌人有不同的血量及攻击模式。 你会怎么写?
最容易想到的就是,哦,我先写一个Monster抽象基类,里边定义了基本的属性和抽象方法,然后让子类继承这个基类,来制造特定的敌人。就像这样

class Monster
{
public:virtual ~Monster() {}virtual const char* getAttack() = 0;protected:Monster(int startingHealth): health_(startingHealth){}private:int health_; // 当前血值
};
class Dragon : public Monster
{
public:Dragon() : Monster(230) {}virtual const char* getAttack(){return "The dragon breathes fire!";}
};class Troll : public Monster
{
public:Troll() : Monster(48) {}virtual const char* getAttack(){return "The troll clubs you!";}
};

那从类图上来看,就是这样的
在这里插入图片描述

那么问题来了,每次你要创造一个新的种类的敌人,即使这些敌人仅仅是名字不一样,其属性和行为都差不多,你都得写代码。 你需要新建一个类,然后继承Monster,再定义其血量以及攻击方法。你的时间都会花在写这几行代码上。如果策划要做几百个这样的敌人,你就得写几百个这种类。同时,如果策划要修改某些属性,比如health,你就得打开VS修改,然后重新编译…这实在是太浪费时间了。

但我们如果使用类型对象模式,我们就可以这么做:
在这里插入图片描述

我们重构代码,让每个怪物有品种。 不是让每个品种继承Monster,我们现在有单一的Monster类和Breed类。

Monster类就是怪物类,Breed类则作为引用保存在怪物类中。通过这个系统,游戏中的每个怪物都是Monster的实例。 Breed类包含了在不同品种怪物间分享的信息:开始血量和攻击字符串。

代码就是这样:

class Breed
{
public:Breed(int health, const char* attack): health_(health),attack_(attack){}int getHealth() { return health_; }const char* getAttack() { return attack_; }private:int health_; // 初始血值const char* attack_;
};
class Monster
{
public:Monster(Breed& breed): health_(breed.getHealth()),breed_(breed){}const char* getAttack(){return breed_.getAttack();}private:int    health_; // 当前血值Breed& breed_;
};

通过这种方法,为了获得攻击字符串,一个怪兽可以调用它品种的方法进行attack。 Breed类本质上定义了一个怪物的类型,这就是为啥这个模式叫做类型对象。

通过这种方法,我们就可以不需要打开VS重新写类来创造新类型了。我们只需要修改Breed所在的配置文件的数据,就可以轻松地创造出无数种新怪物。

类型对象模式的本质就是,将部分的类型系统从硬编码的继承结构中拉出,放到可以在运行时定义的数据中去。

总结
我们回顾下定义,现在就非常直观了

定义类型对象类(Breed)有类型的对象类(Monster)。每个类型对象实例代表一种不同的逻辑类型。 每种有类型的对象保存对描述它类型的类型对象的引用。

实例相关的数据被存储在有类型对象的实例中,被同种类分享的数据或者行为存储在类型对象中。 引用同一类型对象的对象将会像同一类型一样运作。 这让我们在一组相同的对象间分享行为和数据,就像子类让我们做的那样,但没有固定的硬编码子类集合。

原文链接:
类型对象 · Behavioral Patterns · 游戏设计模式 (tkchu.me)

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

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

相关文章

配置文件生成器-秒杀SSM的xml整合

配置文件生成器-秒杀SSM的xml整合 思路&#xff1a; 通过简单的配置&#xff0c;直接生成对应配置文件。 maven坐标 <dependencies><!-- 配置文件生成 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker<…

【FreeRTOS】【STM32】01从零开始的freertos之旅 浏览源码下的文件夹

基于野火以及正点原子 在打开正点原子的资料pdf时&#xff0c;我遇到了pdf无法复制粘贴的问题&#xff0c;这里有个pdf解锁文字复制功能的网址&#xff0c;mark一下。超级pdf 参考资料《STM32F429FreeRTOS开发手册_V1.2》 官方资料 FreeRTOS 的源码和相应的官方书籍均可从官…

竞赛选题 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

Mac 文件设置默认展示和排列方式

点击 现在默认展示方式是分栏方式&#xff0c;因我我勾选了 点击这里就可以修改 始终以xx打开&#xff0c;这里我选择了图标视图。 有快捷键 commandJ 修改默认配置。

JavaSE的常用API学习——字符串相关

目录 一、什么是API 二、String字符串 (一)创建String对象的两种方式 1.直接赋值的内存模型 2.new的内存模型 (二)字符串之间的比较与equals 1.运算符 2.equls()方法 三、StringBuilder的用法 1.StringBuilder的构造方法 2.StringBuilder的常用成员方法 3.小练习&a…

航拍飞行器经营商城小程序的作用是什么

航拍人群越来越越多&#xff0c;一款靠谱的装备往往能达到预期效果&#xff0c;随着互联网信息传播度加深&#xff0c;也吸引了大批同样的爱好者加入航拍序列。 对航拍飞行器企业/经营商来说&#xff0c;市场增幅下也带来了不少商机&#xff0c;然在实际销售及客户赋能方面还是…

深度学习纯小白如何从零开始写第一篇论文?看完这篇豁然开朗!

&#x1f4e2;前言 上个月小贾消失了一段时间&#xff0c;原因就是。。。 写论文去啦&#xff01;&#xff01;&#xff01; 先拿我导的认可镇个楼&#xff1a; 本篇文章将分享我个人从迷茫地找方向→苦苦做了48次实验才高效涨点→写论文到头秃等等一系列真实经历&#xff0c…

JDBC介绍

JDBC介绍 JDBC就是使用java语言来操作数据库的一套API&#xff0c;可以操作不同类型的关系性数据库。各种数据库编写自己数据库的驱动来实现JDBC这套接口&#xff0c;从而实现通过java代码来操作不同类型的关系性数据库。各个数据库的驱动jar包就是实现该接口的实现类&#xf…

LeetCode 143.重排链表

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 分析题目后我们可以直接进行模拟实现。 具体用到的就是我们之前的知识的结合&#xff0c;首先使用快慢指针找到链表的中间结点。然后将后半段链表给翻转一下&#xff0c;然后再让这…

【AI】深度学习——人工智能、深度学习与神经网络

文章目录 0.1 如何开发一个AI系统0.2 表示学习(特征处理)0.2.1 传统特征学习特征选择过滤式包裹式 L 1 L_1 L1​ 正则化 特征抽取监督的特征学习无监督的特征学习 特征工程作用 0.2.2 语义鸿沟0.2.3 表示方式关联 0.2.4 表示学习对比 0.3 深度学习0.3.1 表示学习与深度学习0.3.…

Prompt-Tuning(一)

一、预训练语言模型的发展过程 第一阶段的模型主要是基于自监督学习的训练目标&#xff0c;其中常见的目标包括掩码语言模型&#xff08;MLM&#xff09;和下一句预测&#xff08;NSP&#xff09;。这些模型采用了Transformer架构&#xff0c;并遵循了Pre-training和Fine-tuni…

System Generator学习——使用 AXI 接口和 IP 集成器

文章目录 前言一、目标二、步骤1、检查 AXI 接口2、使用 System Generator IP 创建一个 Vivado 项目3、创建 IP 集成设计&#xff08;IPI&#xff09;4、实现设计 总结 前言 在本节中&#xff0c;将学习如何使用 System Generator 实现 AXI 接口。将以 IP 目录格式保存设计&am…