《奇幻rpg(角色技能 与 strategy模式)》由会员分享,可在线阅读,更多相关《奇幻rpg(角色技能 与 strategy模式)(10页珍藏版)》请在金锄头文库上搜索。
1、 角色技能角色技能 与与 Strategy Design Pattern - Strategy 张子阳 张子阳 jimmy_引言引言 看过一些设计模式方面的书籍和文章,虽然很正式,很权威,(也觉得有那么一点刻板),总 是觉得让人不那么好靠近。于是,我思考着像写故事一样来写下自己对设计模式的理解。我们将 以一款奇幻角色扮演游戏(D 而 WeaponBehavior 在使用之前是应该被赋值的,我们在子类的构造函数中去做这件事: public Barbarian() WeaponBehavior = new UseAxe(); 同时,因为各种 UseWeapon 的方法都被封装在了 WeaponBe
2、havior 中,我们可以动态地改变 它,我们给 Character 基类再添加一个更换武器的方法: public void ChangeWeapon(IWeaponable newWeapon) WeaponBehavior = newWeapon; Strategy 模式模式 实际上,我们上面所做的一切,就完成了 Strategy 模式,现在让我们看看 Stragegy 模式的 官方定义: Strategy 模式定义了一系列的算法,将它们每一个进行封装,并使它们可以相互交换。 Strategy 模式使得算法不依赖于使用它的客户端。 Strategy 模式定义了一系列的算法,将它们每一个进行
3、封装,并使它们可以相互交换。 Strategy 模式使得算法不依赖于使用它的客户端。 代码实现与测试代码实现与测试 我们已经完成了设计,现在通过代码来实现整个过程,简单起见,我们只创建两个角色和三 种武器技能(包含一个不能使用武器的实现),必要的说明会放在注释中。 using System; using System.Collections.Generic; using System.Text; namespace Strategy #region 封装 UseWeapon() 行为 / 定义使用 武器接口 public interface IWeaponable void UseWeapon
4、(); / 使用 剑 的类 public class UseSword : IWeaponable public void UseWeapon() Console.WriteLine(“Action: Sword Armed. There is a sharp sword in my hands now.“); / 使用 斧 的类 public class UseAxe : IWeaponable public void UseWeapon() Console.WriteLine(“Action: Axe Armed. There is a heavy axe in my hands now.
5、“); / 不能使用武器的类 public class UseNothing : IWeaponable public void UseWeapon() Console.WriteLine(“Speak: I cant use any weapon.“); #endregion #region 定义角色类 / 角色基类 public abstract class Character protected IWeaponable WeaponBehavior; / 通过此接口调用实际的 UseWeapon方法。 / 使用武器,通过接口来调用方法 public void UseWeapon() We
6、aponBehavior.UseWeapon(); / 动态地给角色更换武器 public void ChangeWeapon(IWeaponable newWeapon) Console.WriteLine(“Haha, Ive got a new equip.“); WeaponBehavior = newWeapon; public void Walk() Console.WriteLine(“Im start to walk .“); public void Stop() Console.WriteLine(“Im stopped.“); public abstract void Di
7、splayInfo(); / 显示角色信息 / 定义野蛮人 public class Barbarian : Character public Barbarian() / 初始化继承自基类的 WeaponBehavior 变量 WeaponBehavior = new UseAxe(); / 野蛮人用斧 public override void DisplayInfo() Console.WriteLine(“Display: Im a Barbarian from northeast.“); / 定义圣骑士 public class Paladin : Character public Pa
8、ladin() WeaponBehavior = new UseSword(); public override void DisplayInfo() Console.WriteLine(“Display: Im a paladin ready to sacrifice.“); / 定义法师 public class Wizard : Character public Wizard() WeaponBehavior = new UseNothing(); public override void DisplayInfo() Console.WriteLine(“Display: Im a Wi
9、zard using powerful magic.“); #endregion / 测试程序 class Program static void Main(string args) Character barbarian = new Barbarian(); / 默认情况下野蛮人用斧 barbarian.DisplayInfo(); barbarian.Walk(); barbarian.Stop(); barbarian.UseWeapon(); barbarian.ChangeWeapon(new UseSword() ; / 现在也可以使用剑 barbarian.UseWeapon()
10、; barbarian.ChangeWeapon(new UseNothing();/ 也可以让他什么都用不了,当然一不会这样:) barbarian.UseWeapon(); 值得注意的地方是:Strategy 模式没有解决我们之前提到的问题 3。法师不应该暴露出 UseWeapon()的能力(NOTE:NOTE:如果在 VS2005 下使用 C#语言,当你在法师后面按下点号的时候,智 能提示上应该找不到 UseWeapon()方法)而不是提供一个什么都不做的 UseWeapon()方法。 总结总结 在本文中,我们通过一个实现奇幻角色扮演游戏(RPG)的技能设计演示了设计模式中的 Strategy 模式。 我们首先以继承的方式来实现, 然后分析了继承可能引起的问题; 随后又使用接口实现了一 遍,分析了使用接口会带来的问题。 最后,我们通过封装行为的 Strategy 模式完成了整个设计,并给出了它的定义。 希望这篇文章能对你有所帮助!