物品锻造与Decorator模式.PDFVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
物品锻造与Decorator模式

物品锻造 与 Decorator 模式 Design Pattern - Decorator 张子阳 jimmy_dev@163.com 引言 物品锻造是各类奇幻游戏中的常见功能,就拿众所周知的 Diablo 来说吧。假设角色拥有一 把单手剑,可能基础攻击力只有 13,但是它有三个装备孔。当给剑镶嵌一颗蓝宝石的时候,它 就拥有了额外的冰冻效果并多加 2点攻击力;当给剑镶嵌一颗红宝石的时候,它又拥有了额外的 火焰伤害并多加 3 点攻击力;当给剑镶嵌一颗绿宝石的时候,它又拥有了额外的中毒伤害并多加 的 4 点攻击力。当然,也可以三个孔都镶嵌同一色的宝石。本文将说明如何使用 Decorator 模式 来完成这样的设计。 使用继承来扩展 我们首先想到应该有个基类 Weapon,它供所有各式各样的武器继承,比如说 Sword、Axe、 Bow。Description 字段代表武器的说明,比如“One-Hand light Sword”,Damage()方法则用于 获取武器的伤害,GetDescription 用于获取武器的说明。在不考虑宝石的情况下,我们得到下 面的设计: 现在我们考虑如何创建镶嵌有宝石的武器。我们首先考虑到可以用继承来实现这样的设计, 结果却发现如果我们需要定义所有嵌宝石的剑(Sword),就需要 3+6+7 = 16 个类(NOTE:三个物 品孔,每个孔都有 蓝、红、绿 三种选择,可以两个或者三个孔同一色),如果我们给镶嵌了两 颗蓝一颗红宝石的剑命名为 Blue2RedSword,给三色不同不剑命名为 BlueRedGreenSword,其余 的类推。那么,我们会得到下面这样庞大的类体系(只绘制了部分): 而这仅仅是开始,如果我们需要再添一种宝石,比如说白色,它可以附加诅咒的效果;或者 我们需要给武器再添加一个物品孔,那么我们的类的数目将迅速的由十几个变成几十个。 我们发现使用继承的问题:使用继承时将会创建出大量的类。除此以外,使用继承,也意味 我们需要实例化一个特定的子类以获取我们需要的功能(方法),这在编译阶段(compile time) 就已经确定,类的客户端不能控制何时(run time)根据需要改变,除非再实例化另一个子类。 使用复合来扩展 我们发现继承会带来两个主要的问题,所以我们考虑换一种方式来思考,我们可以使用复合 来完成它。说详细一点,就是我们将 蓝宝石(BlueDiamond)、红宝石(RedDiamond)、绿宝石 (GreenDiamond) 作为实体变量(instance variable)复合到基类中,然后在基类的 Damage()方 法中计算出所有宝石额外增加的伤害(此时基类的 Damage()方法不再是抽象的)。 public abstract class Weapon{ public virturl int Damage(){ int total = 0; if(redDiamond!=null) total += redDiamond.Damage(); //附加红宝石的伤害 if(blueDiamond!=null) total += blueDiamond.Damage(); //附加蓝宝石的伤害 if(greenDiamond!=null) total += greenDiamond.Damage(); //附加绿宝石的伤害 return total; } } 而在实体子类中,我们覆盖这个方法,在方法内部先调用基类方法获取宝石的附加伤害,然 后再给它加上武器本身的伤害。 public class Sword: Weapon{ public override

文档评论(0)

***** + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档