网站大量收购独家精品文档,联系QQ:2885784924

Strategy模式-张子阳.PDF

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Strategy模式-张子阳

角色技能 与 Strategy Design Pattern - Strategy 张子阳 jimmy_dev@163.com 引言 看过一些设计模式方面的书籍和文章,虽然很正式,很权威,(也觉得有那么一点刻板),总 是觉得让人不那么好靠近。于是,我思考着像写故事一样来写下自己对设计模式的理解。我们将 以一款奇幻角色扮演游戏(DD)为蓝本,通过游戏中的模块创建或者功能实现来展示 GOF 的设计 模式。当然,这不是一款真正意义上的游戏,只是为了了解设计模式,所以,我会尽可能的使游 戏简单。废话不多说了,我们 Start off 吧。 继承及其问题 在开始我们的游戏之旅之前,我们需要定义玩家可以选择的角色。我们首先想到了四个角色 职业:野蛮人(Barbarian)、佣兵(Soldier)、圣骑士(Paladin)、法师(Wizard)。 按照 OO 的思想,我们需要先定义一个抽象类作为基类,然后供这四个职业继承,以实现代 码的重用。在此之前,我来分析一下角色拥有的能力(方法): DisplayInfo():显示角色的基本信息。(比如圣骑士:追求至善的热情、维护法律的意 志、击退邪恶的力量 -- 这就是圣骑士的三件武器 ... ) Walk():让角色行走。 Stay():让角色站立。 一般来说,设计时会遵循这样的原则: 1. 对于所有继承类都有,但是每个继承类的实现各不相同的方法,我们在基类中只给出定 义,不给出实现,而在继承类中予以实现。换言之,就是在基类中定义一个抽象方法。 2. 对于所有继承类都有,并且每个继承类的实现完全相同的方法,我们直接在基类中实现 它,而由子类去继承,以实现代码重用。 很显然,每个角色都拥有 DisplayInfo()、Walk() 和 Stay()的能力。其中,DisplayInfo() 对于每个角色都不同;而 Walk()和Stay()对每个角色都相同。于是,我们构建基类 Charactor, 实现了这样的设计: 在基类中实现的问题 到目前为止,我们的程序仅实现了四个角色样子各不相同,并且都能行走和站立。为了让角 色更丰富一些,现在我们让角色可以装配武器,所以,我们需要新添一个方法,我们给它命名为 UseWeapon(),它的实现效果是角色手中拿起一把剑。我们首先想到的是可以将 UseWeapon()放 到基类中,这样可以实现代码的重用。 于是,我们的设计变成下图: 这样看上去很不错,我们利用了面向对象四大思想(抽象、封装、继承、多态)中的继承。可 是好景不长,没过几天,我们觉得这样的角色设置有些单调,个性不鲜明,我们想要对游戏规则 做如下修改: 1、 野蛮人用斧。 2、 法师不用武器。 这样,便引出了在本例中使用继承的问题:我们发现法师、野蛮人都可以用剑,而这不符合 我们定义的游戏规则。 我们将上面的问题抽象化,得到的结论是:给基类添加实体方法,使得不应该拥有此方法 的子类也拥有了此方法,也使得所有子类方法拥有了完全一样的实现。 覆盖基类方法的问题 这个问题似乎很好解决,既然野蛮人和法师不同,那我们只需要让野蛮人和法师覆盖基类的 UseWeapon() 方法就可以了,与此同时,我们将基类方法声明为 virtual 虚拟方法,并给出实 现。这个实现,可以视为角色的默认实现(默认角色用剑)。 这一次,我们的设计变成了下面这样: 这样看上去似乎很好的解决了这个问题,直到有一天,我们又有了新的需求: 1、 需要新添角色 战士(Warrior),他也使用斧。

文档评论(0)

sunshaoying + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档