mvc不讲了。说一个非常有用的:策略模式。
策略模式的思想在设计模式里面写的非常清楚,概括下来就是将行为和行为的实现分离。在head 设计模式这本书里面讲的例子也非常容易理解,基本上可以直接搬到游戏中来。
如图:
在游戏中,玩家,怪味,NPC,坐骑,宠物,侠客等等,他们都是可以活动的对象,也有一些共同的行为,所以都可以由一个基类派生出来,但是他们也有很多不同的行为,比如NPC不能战斗,坐骑不能说话,等等。
策略模式为我们很好地解决了这个问题,方法如下:
1 将各个行为在基类做出相应的接口,比如上面图章actor这个类拥有6个接口,移动,跳跃,跑动,谈话,换装,战斗。然后actor类用空的实现(什么事情都不做)来实现这些接口。然后各个子类在继承actor类时,就有了对所有接口的一个空实现了。
2 分析各个子类需要的实现方式,分别实现为各个行为类,比如玩家需要跳跃,那么实现一个玩家跳跃类,在role对象初始化时,将这个跳跃类的对象复制给行为变量,这样玩家就可以跳跃了;
下面贴一些伪代码,帮助理解:
- public class Actor
- {
- public TalkInterface talk;
- public MoveInterface move;
- public FightInterface fight;
- public Actor()
- {
- talk = new DefaultTalk();
- move = new DefaultMove();
- fight = new DefaultFight();
- }
- }
- public class Role : Actor
- {
- public Role()
- {
- move = new NormalMove();
- fight = new RoleFight();
- }
- }
- public class Horse : Actor
- {
- public Horse()
- {
- move = new HorseMove();
- }
- }
- public class NPC : Actor
- {
- public NPC()
- {
- talk = new NpcTalk();
- }
- }
- interface TalkInterface
- {
- void doTalk();
- }
- interface MoveInterface
- {
- void doMove();
- }
- interface FightInterface
- {
- void doFight();
- }
- public class DefaultTalk : TalkInterface
- {
- void doTalk() // do nothing
- {
- }
- }
- public class DefaultMove : MoveInterface
- {
- void doMove() // do nothing
- {
- }
- }
- public class DefaultFight : FightInterface
- {
- void doFight() // do nothing
- {
- }
- }
- public class NpcTalk : TalkInterface
- {
- public void doTalk()
- {
- ...
- }
- }
- public class NormalMove : MoveInterface
- {
- public void doMove()
- {
- ...
- }
- }
- public class HorseMove : MoveInterface
- {
- public void doMove()
- {
- ...
- }
- }
- public class RoleFight : FightInterface
- {
- public void doFight()
- {
- ...
- }
- }
这样的好处就有很多了,比如用基类的引用类型去调用各个子类对象的各个行为都可以正常工作了。