- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 耳内镜微创外科技术PPT幻灯片.pptx VIP
- 肯尼亚建筑市场行业报告.pptx
- 浙江杭州余杭交通集团有限公司招聘笔试题库2023.pdf VIP
- 人工胆囊、人工胆囊设备和人工胆囊在胆囊手术中的应用.pdf VIP
- 重力与弹力高一上学期物理人教版2019必修第一册+.pptx VIP
- 胃癌的诊治现状与进展.pptx VIP
- 数控压装压力机 第2部分:技术条件.docx VIP
- 【课件】匀变速直线运动速度与时间的关系+课件-高一上学期物理人教版(2019)必修第一册.pptx VIP
- XX医院职能部门监管手术、麻醉授权管理督导、检查、总结、反馈及持续改进记录表.pdf VIP
- 电力调度数据网络接入技术规范及网络拓扑图.doc VIP
文档评论(0)