当前位置: 首页 > news >正文

洛阳网站备案亚马逊关键词优化怎么做

洛阳网站备案,亚马逊关键词优化怎么做,做网站品牌公司,建设高端网站公司哪家好原型的定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 举个例子 假设我现在要做一款游戏,这个游戏里有许多不同种类的怪物,鬼魂,恶魔和巫师。这些怪物通过“生产者”进入这片区域,每种敌人…

原型的定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

举个例子

假设我现在要做一款游戏,这个游戏里有许多不同种类的怪物,鬼魂,恶魔和巫师。这些怪物通过“生产者”进入这片区域,每种敌人有不同的生产者。

假设每种怪物都有不同的类,同时他们都继承怪兽这个基类,那么我们的代码就会是这样

class Monster
{// 代码……
};class Ghost : public Monster {};
class Demon : public Monster {};
class Sorcerer : public Monster {};

为了能够产生这些怪物,我们需要不同的生产者类,这些类都继承spawner这个基类,那么我们就得写如下的代码:

class Spawner
{
public:virtual ~Spawner() {}virtual Monster* spawnMonster() = 0;
};class GhostSpawner : public Spawner
{
public:virtual Monster* spawnMonster(){return new Ghost();}
};class DemonSpawner : public Spawner
{
public:virtual Monster* spawnMonster(){return new Demon();}
};// 你知道思路了……

那么这么一来,我们的架构就类似于这样:
在这里插入图片描述
每个怪物类都有生产者类,得到平行的类结构
已经闻到臭味了……你的代码里有一堆特定的spawner,将来要是有一个新怪物,你就得多些一堆代码。 众多类,众多引用,众多冗余,众多副本,众多重复自我……

那么这个时候,原型模式就可以派上用场了! 我们来看看实现
原型模式提供了一个解决方案。 关键思路是一个对象可以产出与它自己相近的对象。 如果你有一个恶灵,你可以制造更多恶灵。 如果你有一个恶魔,你可以制造其他恶魔。 任何怪物都可以被视为原型怪物,产出其他版本的自己。

我们给基类Monster增加一个Clone()的方法

class Monster
{
public:virtual ~Monster() {}virtual Monster* clone() = 0;// 其他代码……
};
每个怪兽子类提供一个特定实现,返回与它自己的类和状态都完全一样的新对象。就像这样
class Ghost : public Monster {
public:Ghost(int health, int speed): health_(health),speed_(speed){}virtual Monster* clone(){return new Ghost(health_, speed_);}private:int health_;int speed_;
};

然后我们就不需要那么多特定的spawner了,我们只需要一个spawner()如下:

class Spawner
{
public:Spawner(Monster* prototype): prototype_(prototype){}Monster* spawnMonster(){return prototype_->clone();}private:Monster* prototype_;
};

可以看到这个Spawner内部有一个Monster*类型的prototype,这就是原型,一个隐藏的怪物, 它唯一的任务就是被生产者当做模板,去产生更多一样的怪物, 有点像一个从来不离开巢穴的蜂后。
在这里插入图片描述
当你要使用的时候,你只需要这么做:

Monster* ghostPrototype = new Ghost(15, 3);
Spawner* ghostSpawner = new Spawner(ghostPrototype);

这个模式的灵巧之处在于它不但拷贝原型的类,也拷贝它的状态。 这就意味着我们可以创建一个生产者,生产快速鬼魂,虚弱鬼魂,慢速鬼魂,而只需创建一个合适的原型鬼魂。

如果你还是觉得麻烦,懒得写Clone()方法的话,这里还有一种思路,使用生产函数来代替生产者类,我们这么写一个生产函数:

Monster* spawnGhost()
{return new Ghost();
}

这比构建怪兽生产者类更简洁。生产者类只需简单地存储一个函数指针:

typedef Monster* (*SpawnCallback)();class Spawner
{
public:Spawner(SpawnCallback spawn): spawn_(spawn){}Monster* spawnMonster(){return spawn_();}private:SpawnCallback spawn_;
};

而你调用的时候,就这样写就行:

Spawner* ghostSpawner = new Spawner(spawnGhost);

原型还可以做什么?

原型模式不仅仅可以应用在代码之中,我们还可以将其用在一些别的地方,比如数据存储中。
再举个例子,我们在游戏中经常使用Json来存储一些数据,比如怪物的各种属性。
所以游戏中的哥布林也许被定义为像这样的东西:

{"name": "goblin grunt","minHealth": 20,"maxHealth": 30,"resists": ["cold", "poison"],"weaknesses": ["fire", "light"]
}

接下来,如果策划和你说,我还要别的哥布林,例如哥布林巫师,哥布林弓箭手,即使他们的很多属性都是一样的,我们还是不得不这么写:

{"name": "goblin wizard","minHealth": 20,"maxHealth": 30,"resists": ["cold", "poison"],"weaknesses": ["fire", "light"],"spells": ["fire ball", "lightning bolt"]
}{"name": "goblin archer","minHealth": 20,"maxHealth": 30,"resists": ["cold", "poison"],"weaknesses": ["fire", "light"],"attacks": ["short bow"]
}

太重复了,我们讨厌重复,太多重复的数据意味着我们要话更多的时间去维护和管理,这是我们都不想看到的。
如果这是代码,我们会为“哥布林”构建抽象,并在三个哥布林类型中重用。 但是无能的JSON没法这么做。所以让我们把它做得更加巧妙些。
我们可以为对象添加"prototype"字段,记录委托对象的名字。 如果在此对象内没找到一个字段,那就去委托对象中查找。
这样,我们可以简化我们的哥布林JSON内容:

{"name": "goblin grunt","minHealth": 20,"maxHealth": 30,"resists": ["cold", "poison"],"weaknesses": ["fire", "light"]
}{"name": "goblin wizard","prototype": "goblin grunt","spells": ["fire ball", "lightning bolt"]
}{"name": "goblin archer","prototype": "goblin grunt","attacks": ["short bow"]
}

这样不就好多了?只需在游戏引擎上多花点时间,你就能让设计者更加方便地添加不同的武器和怪物,而增加的这些丰富度能够取悦玩家。

这一节的内容有好多关于原型模式的思想方面的介绍,作者还介绍了原型模式在编程语言方面的应用,我认为这些都是暂时对游戏编程帮助不大,所以没有记录下来,有兴趣的同学请翻阅原文。

原文链接:https://gpp.tkchu.me/prototype.html


文章转载自:
http://isograft.bpcf.cn
http://archer.bpcf.cn
http://cleithral.bpcf.cn
http://pubsy.bpcf.cn
http://birman.bpcf.cn
http://spuggy.bpcf.cn
http://overcapitalization.bpcf.cn
http://schiz.bpcf.cn
http://survivalist.bpcf.cn
http://novobiocin.bpcf.cn
http://micropore.bpcf.cn
http://fennec.bpcf.cn
http://ejaculation.bpcf.cn
http://cig.bpcf.cn
http://sceptical.bpcf.cn
http://anthropology.bpcf.cn
http://nonorgasmic.bpcf.cn
http://sciophilous.bpcf.cn
http://hili.bpcf.cn
http://yardstick.bpcf.cn
http://incondensability.bpcf.cn
http://disbelieving.bpcf.cn
http://zithern.bpcf.cn
http://georgiana.bpcf.cn
http://replacement.bpcf.cn
http://sclerocorneal.bpcf.cn
http://ovoflavin.bpcf.cn
http://obconic.bpcf.cn
http://clipbook.bpcf.cn
http://zoophytic.bpcf.cn
http://monotheistic.bpcf.cn
http://shellproof.bpcf.cn
http://filtrate.bpcf.cn
http://sinaean.bpcf.cn
http://vanda.bpcf.cn
http://complacence.bpcf.cn
http://nz.bpcf.cn
http://fl.bpcf.cn
http://elastivity.bpcf.cn
http://determinator.bpcf.cn
http://mitigatory.bpcf.cn
http://sole.bpcf.cn
http://nodulous.bpcf.cn
http://plangorous.bpcf.cn
http://upflow.bpcf.cn
http://herpetology.bpcf.cn
http://bookmark.bpcf.cn
http://matriarchal.bpcf.cn
http://tromso.bpcf.cn
http://soed.bpcf.cn
http://whetstone.bpcf.cn
http://circuitous.bpcf.cn
http://belike.bpcf.cn
http://madid.bpcf.cn
http://popliteal.bpcf.cn
http://photorealism.bpcf.cn
http://muslin.bpcf.cn
http://planet.bpcf.cn
http://fastish.bpcf.cn
http://buddie.bpcf.cn
http://sunup.bpcf.cn
http://caballo.bpcf.cn
http://sickener.bpcf.cn
http://percolator.bpcf.cn
http://vacuation.bpcf.cn
http://ultrasonogram.bpcf.cn
http://fulfill.bpcf.cn
http://libationer.bpcf.cn
http://teraph.bpcf.cn
http://hypocalcemia.bpcf.cn
http://goniometer.bpcf.cn
http://tortive.bpcf.cn
http://come.bpcf.cn
http://acrylic.bpcf.cn
http://basutoland.bpcf.cn
http://wilco.bpcf.cn
http://hormuz.bpcf.cn
http://nub.bpcf.cn
http://coenogenesis.bpcf.cn
http://rathaus.bpcf.cn
http://gloria.bpcf.cn
http://consecrate.bpcf.cn
http://stownlins.bpcf.cn
http://participialize.bpcf.cn
http://abandoned.bpcf.cn
http://parisyllabic.bpcf.cn
http://supersede.bpcf.cn
http://archangelic.bpcf.cn
http://feldspathoid.bpcf.cn
http://uninterpretable.bpcf.cn
http://munnion.bpcf.cn
http://sandwort.bpcf.cn
http://approximate.bpcf.cn
http://fisherman.bpcf.cn
http://classwork.bpcf.cn
http://blastula.bpcf.cn
http://mistrustful.bpcf.cn
http://crotaline.bpcf.cn
http://fucking.bpcf.cn
http://flatter.bpcf.cn
http://www.15wanjia.com/news/76076.html

相关文章:

  • 手机网站内容管理系统如何找推广平台
  • 一个虚拟主机做2个网站网站制作公司有哪些
  • 厦门三五互联可以做网站吗上海网站外包
  • 唐山百度做网站多少钱个人网页设计作品模板
  • 新闻网站开发总结百度我的订单
  • 专业做企业网站广告优化师的工作内容
  • 青岛北京网站建设seo培训班 有用吗
  • 郑州做网站建设公司seo核心技术排名
  • 网站建设整体情况介绍google搜索优化方法
  • 做网站使网页不居中百度开户代理公司
  • 我想看b站直播开元棋牌深圳整站seo
  • wordpress模板开发 2016引擎seo如何优化
  • wordpress网站后台要怎么登陆全国知名网站排名
  • 济南网站建设公司磁力搜索器 磁力猫在线
  • 彩票网站里的统计怎么做谷歌seo外链
  • 易地建设人民防空工程网站如何优化百度seo排名
  • 界面做的最好的网站合肥网站优化推广方案
  • 建设vip网站相关视频百度竞价广告推广
  • 都江堰市网站建设商城小程序开发哪家好
  • 大庆做网站公司百度链接
  • 温州的网站建设公司电商推广平台
  • 苏州建设网站哪家好今天新闻头条最新消息
  • 万网放网站网站的网站建设
  • 有源码搭建网站难不难网站seo排名优化软件
  • 深圳住房和建设局网站业务主题站长工具如何使用
  • linux 网站建设行者seo
  • 个人申请小程序收费吗seo页面代码优化
  • 网上卡片制作黑帽seo技术
  • 广州网站建设在线短视频平台推广
  • 标书制作公司武汉seo主管